Plotly – 更改 x 轴(日期)的范围

huangapple go评论67阅读模式
英文:

Plotly - change range of x-axis (date)

问题

以下是翻译的内容:

编辑2:

哇,太棒了,谢谢 Sam!这个方法确实有效,不过我的预览中的图表变得非常小:
Plotly – 更改 x 轴(日期)的范围

发生了什么?我尝试理解您在Plotly中提取的边距列表,但我并不真正理解它,它是根据某个位置(还可以更改)移动图表(以像素为单位)的,那么“pad”表示什么?

我不知道我已经截取了系列,而没有使用coord_cartesian,很高兴知道这一点。由于我的系列一直追溯到1996年,日期仍然重叠 - 是否没有办法启用一些自动缩放?否则,我可能必须缩短系列,可能到2018年的数据,或者2020年。能够查看超过12个月前的数据只是一个很好的功能 - 不是必需的。

再次感谢!

英文:

I managed to change the range in the ggplot, but when passing that plot to plotly it totaly disregarded this.

Goal

I want to pass a long serie from 1996 onwards to plotly, it want the plotly to have all the date in it, but ONLY show a set of the series which I decide (about last 18 months) - but the user should be able to zoom-out and see the entire serie if one want that.
-> How can I achieve this?

I have the limits already created as values called maxdate and mindate so these are available to call-upon. NOTE however that these changes, so dates can not be passed manually in the code here. There is a col. in my df that has the date in date-format, which can be called upon if my variables can't be used.

> str(maxdate)
 Date[1:1], format: "2023-01-01"
> str(mindate)
 Date[1:1], format: "2021-07-01"

EDIT1

str of df_konj

> str(df_konj)
'data.frame':	1950 obs. of  3 variables:
 $ Indikator: Factor w/ 6 levels "Barometerindikatorn",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Period   : Date, format: "1996-01-01" "1996-02-01" "1996-03-01" "1996-04-01" ...
 $ value    : num  NA NA NA NA NA NA 85.6 88 88.9 91 ...

code for ggplot:

df_konj_dia <- ggplot(df_konj, aes(x = Period, y = value, group=Indikator, color=Indikator, 
                    linetype=Indikator, linewidth = Indikator)) +
  geom_point(size=2) + 
  geom_line() +
  ylim(50, 150)
  scale_x_date(limits=(c(mindate, maxdate)))

the plotly code:

df_konj_plotly <- ggplotly(df_konj_dia, tooltip = c("x","y","colour")) %>%
  layout(title = list(text = paste0('Konjunkturbarometern - månadsbarometern, flera indikatorer',
                                    '<br>',
                                    '<sup>',
                                    'Sverige, säsongsrensat','</sup>')),
        legend = list(x = 100, y = 0.5),
      xaxis = list(rangeslider = list(visible = T)))
         

df_konj_plotly

dput-output of df: "df_konj", yr filtered from 2018 though

structure(list(Indikator = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), levels = c("Barometerindikatorn", 
"\tDetaljhandel", "Bygg & anläggning", "Hushåll", "Tillverkningsindustri", 
"Tjänstesektorn"), class = "factor"), Period = structure(c(17532, 
17563, 17591, 17622, 17652, 17683, 17713, 17744, 17775, 17805, 
17836, 17866, 17897, 17928, 17956, 17987, 18017, 18048, 18078, 
18109, 18140, 18170, 18201, 18231, 18262, 18293, 18322, 18353, 
18383, 18414, 18444, 18475, 18506, 18536, 18567, 18597, 18628, 
18659, 18687, 18718, 18748, 18779, 18809, 18840, 18871, 18901, 
18932, 18962, 18993, 19024, 19052, 19083, 19113, 19144, 19174, 
19205, 19236, 19266, 19297, 19327, 19358, 17532, 17563, 17591, 
17622, 17652, 17683, 17713, 17744, 17775, 17805, 17836, 17866, 
17897, 17928, 17956, 17987, 18017, 18048, 18078, 18109, 18140, 
18170, 18201, 18231, 18262, 18293, 18322, 18353, 18383, 18414, 
18444, 18475, 18506, 18536, 18567, 18597, 18628, 18659, 18687, 
18718, 18748, 18779, 18809, 18840, 18871, 18901, 18932, 18962, 
18993, 19024, 19052, 19083, 19113, 19144, 19174, 19205, 19236, 
19266, 19297, 19327, 19358, 17532, 17563, 17591, 17622, 17652, 
17683, 17713, 17744, 17775, 17805, 17836, 17866, 17897, 17928, 
17956, 17987, 18017, 18048, 18078, 18109, 18140, 18170, 18201, 
18231, 18262, 18293, 18322, 18353, 18383, 18414, 18444, 18475, 
18506, 18536, 18567, 18597, 18628, 18659, 18687, 18718, 18748, 
18779, 18809, 18840, 18871, 18901, 18932, 18962, 18993, 19024, 
19052, 19083, 19113, 19144, 19174, 19205, 19236, 19266, 19297, 
19327, 19358, 17532, 17563, 17591, 17622, 17652, 17683, 17713, 
17744, 17775, 17805, 17836, 17866, 17897, 17928, 17956, 17987, 
18017, 18048, 18078, 18109, 18140, 18170, 18201, 18231, 18262, 
18293, 18322, 18353, 18383, 18414, 18444, 18475, 18506, 18536, 
18567, 18597, 18628, 18659, 18687, 18718, 18748, 18779, 18809, 
18840, 18871, 18901, 18932, 18962, 18993, 19024, 19052, 19083, 
19113, 19144, 19174, 19205, 19236, 19266, 19297, 19327, 19358, 
17532, 17563, 17591, 17622, 17652, 17683, 17713, 17744, 17775, 
17805, 17836, 17866, 17897, 17928, 17956, 17987, 18017, 18048, 
18078, 18109, 18140, 18170, 18201, 18231, 18262, 18293, 18322, 
18353, 18383, 18414, 18444, 18475, 18506, 18536, 18567, 18597, 
18628, 18659, 18687, 18718, 18748, 18779, 18809, 18840, 18871, 
18901, 18932, 18962, 18993, 19024, 19052, 19083, 19113, 19144, 
19174, 19205, 19236, 19266, 19297, 19327, 19358, 17532, 17563, 
17591, 17622, 17652, 17683, 17713, 17744, 17775, 17805, 17836, 
17866, 17897, 17928, 17956, 17987, 18017, 18048, 18078, 18109, 
18140, 18170, 18201, 18231, 18262, 18293, 18322, 18353, 18383, 
18414, 18444, 18475, 18506, 18536, 18567, 18597, 18628, 18659, 
18687, 18718, 18748, 18779, 18809, 18840, 18871, 18901, 18932, 
18962, 18993, 19024, 19052, 19083, 19113, 19144, 19174, 19205, 
19236, 19266, 19297, 19327, 19358), class = "Date"), value = c(108.2, 
108.3, 108.8, 110.1, 109.8, 109.8, 109.5, 110, 109.6, 106.1, 
104.7, 104.8, 100.7, 101.8, 102.4, 104.4, 101.8, 100.4, 98.2, 
95, 93.3, 92.9, 93.7, 93, 95.9, 98.6, 93.4, 60.9, 64.9, 76.4, 
84.4, 87, 93.7, 94.3, 95.8, 95.1, 100.5, 103.7, 105.3, 112.2, 
117.4, 118.1, 120.3, 118.9, 118.6, 120, 117.7, 116.9, 110.9, 
114, 112.2, 110.3, 110.8, 106.1, 102.4, 97.7, 91.8, 85.6, 85.6, 
85, 82.3, 108.8, 109.1, 112.3, 114.8, 114.9, 113.6, 114.5, 116.5, 
112.8, 111.3, 111.6, 112.5, 106.8, 109, 104.9, 107.4, 102.6, 
100.8, 97, 93.6, 94.8, 94.6, 94.2, 93.5, 98.4, 101.3, 99.1, 72.2, 
77.2, 90.4, 95.9, 97.1, 103.9, 103.1, 106.4, 104.6, 111.2, 111.7, 
114.5, 117.2, 121.8, 121.2, 124.4, 124.3, 123.3, 126.2, 124, 
124.8, 120.9, 123.6, 124.3, 120.5, 124.6, 119.5, 118.9, 115.3, 
109.8, 104.8, 104.5, 103.7, 99.5, 111.6, 107, 111.3, 114.1, 107.8, 
107.1, 106.4, 107.1, 106.6, 102.1, 99.9, 101.3, 102.1, 101.6, 
101.9, 102.8, 102.8, 100.9, 102.2, 101.1, 102.5, 102.8, 102.8, 
102.6, 101.4, 100.7, 98.7, 92.7, 88.6, 88.7, 91.7, 93.3, 89.2, 
92.3, 94.2, 96, 95.2, 95.7, 96.8, 101.3, 107.2, 108.9, 106.1, 
107.5, 109.7, 110.1, 108.5, 107, 108.9, 108, 107.1, 108, 105.6, 
106.6, 106.9, 107.4, 105.2, 102.7, 101.5, 101.2, 96.1, 103.8, 
105.9, 104.5, 101.6, 103.4, 105.3, 98, 102, 103.8, 101.1, 101.6, 
100.9, 99.5, 98.6, 98.3, 104.2, 106.6, 102.2, 101.2, 101.7, 101.1, 
101.2, 104.2, 107.8, 107.7, 109.5, 104.4, 73.7, 77.1, 85, 94.2, 
97.6, 102, 105.1, 96.3, 96.8, 96.6, 98.4, 96.5, 111, 108.2, 113, 
116.7, 109.2, 113.7, 116.9, 116.8, 112.8, 103.4, 119.2, 111.1, 
109.5, 110.3, 102.8, 92.2, 91.2, 82.1, 76.2, 76.7, 75.1, 78.6, 
104.5, 105.6, 103.5, 103.6, 103.3, 105.8, 104.9, 101.7, 104.5, 
101, 98.2, 98.4, 95.9, 96.3, 101.1, 101.5, 101.8, 101.1, 98.6, 
97, 92.9, 90.8, 93.2, 91.7, 93.4, 94.2, 88.2, 52.3, 55.1, 63.8, 
74.2, 79.2, 86.1, 86.5, 88, 86.7, 91, 96.7, 96.9, 106, 109.1, 
112.3, 114, 111.5, 111.2, 112.5, 111.4, 110, 104.2, 107.4, 109.1, 
109.6, 108.5, 105.9, 103.7, 97.1, 94.4, 88.5, 86, 87.5, 85.8, 
106, 104.7, 103.1, 102.9, 103.3, 101.3, 101.8, 104.1, 104.9, 
100.8, 99.9, 97.6, 96.3, 96.4, 99.1, 100.1, 97.6, 98.2, 100.9, 
97.2, 94.2, 96.4, 96.1, 96.2, 96, 99.7, 94.1, 81.4, 83.7, 88.6, 
90.3, 89.7, 92.3, 94.1, 92.7, 94.9, 97, 99.4, 100.4, 104.2, 110.4, 
107.7, 107.6, 107.5, 107.2, 104, 101, 99.5, 93.8, 92.7, 82.1, 
81.3, 77.1, 73.7, 64.9, 64.1, 57.2, 53.6, 58.6, 55.4, 56.3)), row.names = c(NA, 
-366L), class = "data.frame")

EDIT2:

Wow, awesome - thanks Sam!
This works although my chart get's very small in my preview:
Plotly – 更改 x 轴(日期)的范围

What's going on? I've tried to understand this margin list you fetch (in plotly), but don't really understand it, it's moving the chart (in pixels) based on some position that you also can change? What does the pad indicate?

I didn't know I cut of the series but not using the coord_cartesian, great to know. Since my series is all the way back to 1996, date still overlap - there's no way to get some autoscaling get going? Else I'll have to shorten the serie, maybe to 2018 as the data you got, or 2020. Being able to go more than 12m back is just a nice feature - it's not required.

Thanks again!

答案1

得分: 1

你有两个问题。你的主要问题是,当你设置坐标轴限制时,实际上是切断了你感兴趣的情节部分。你应该使用coord_cartesian()

笛卡尔坐标系... 不会像设置刻度限制那样更改基础数据。

df_konj_dia <- ggplot(df_konj, aes(x = Period, y = value, group=Indikator, color=Indikator, 
                    linetype=Indikator, linewidth = Indikator)) +
  geom_point(size=2) + 
  geom_line() +
  coord_cartesian(x=(c(mindate, maxdate)), y = c(50, 150))

其次,你需要为plotly提供轴刻度和标签。否则,当你向时间倒滚时,你将看不到任何轴标签。你可以像这样创建它们:

x_axis_breaks  <- seq(
            from = min(df_konj$Period), 
            to = max(df_konj$Period),
            by = "6 months"
        )   

tickvals  <- as.integer(x_axis_breaks)
ticktext  <- format(x_axis_breaks, "%Y-%m")

然后按以下方式提供给plotly(我还更改了边距,因为它们重叠):

df_konj_plotly <- ggplotly(df_konj_dia, tooltip = c("x","y","colour")) %>%
  layout(title = list(text = paste0('Konjunkturbarometern - månadsbarometern, flera indikatorer',
                                    '<br>',
                                    '<sup>',
                                    'Sverige, säsongsrensat','</sup>')),
        legend = list(x = 100, y = 0.5),
      xaxis = list(
        rangeslider = list(visible = T),
        ticktext = ticktext,
        tickvals = tickvals,
        tickmode = "array"
    ),
    autosize = F, margin = list(
  l = 50,
  r = 20,
  b = 20,
  t = 100,
  pad = 4
)
)

这将允许你向时间倒滚并仍然在x轴上看到日期标签。

英文:

You have two problems. Your main one is that you are actually cutting off the parts of the plot you are interested in when you set your axis limits. You should use coord_cartesian():

> The Cartesian coordinate system... will not change the underlying data like setting limits on a scale will.

df_konj_dia &lt;- ggplot(df_konj, aes(x = Period, y = value, group=Indikator, color=Indikator, 
                    linetype=Indikator, linewidth = Indikator)) +
  geom_point(size=2) + 
  geom_line() +
  coord_cartesian(x=(c(mindate, maxdate)), y = c(50, 150))

Secondly you need to supply plotly with axis breaks and labels. Otherwise, when you scroll backwards in time, you will not see any axis labels. You can create them like this:

x_axis_breaks  &lt;- seq(
            from = min(df_konj$Period), 
            to = max(df_konj$Period),
            by = &quot;6 months&quot;
        )   

tickvals  &lt;- as.integer(x_axis_breaks)
ticktext  &lt;- format(x_axis_breaks, &quot;%Y-%m&quot;)

Then supply them to plotly as follows (I've also changed the margins as they overlapped):

df_konj_plotly &lt;- ggplotly(df_konj_dia, tooltip = c(&quot;x&quot;,&quot;y&quot;,&quot;colour&quot;)) %&gt;%
  layout(title = list(text = paste0(&#39;Konjunkturbarometern - m&#229;nadsbarometern, flera indikatorer&#39;,
                                    &#39;&lt;br&gt;&#39;,
                                    &#39;&lt;sup&gt;&#39;,
                                    &#39;Sverige, s&#228;songsrensat&#39;,&#39;&lt;/sup&gt;&#39;)),
        legend = list(x = 100, y = 0.5),
      xaxis = list(
        rangeslider = list(visible = T),
        ticktext = ticktext,
        tickvals = tickvals,
        tickmode = &quot;array&quot;
    ),
    autosize = F, margin = list(
  l = 50,
  r = 20,
  b = 20,
  t = 100,
  pad = 4
)
)

This will allow you to move your window backwards in time and still see date labels on the x-axis:

Plotly – 更改 x 轴(日期)的范围

huangapple
  • 本文由 发表于 2023年2月23日 19:53:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75544481.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定