在绘图图中为单个数据系列定义特定的ylim值

时间:2018-07-13 16:46:30

标签: r plotly r-plotly

我正在创建一个绘图图形,该图形具有一个按钮,用于选择要显示的序列,这是一个基本的绘图功能。 我的问题是该图的目的是显示系列之间变异性的差异和增长率的差异。 根据要绘制的系列的最大值/最小值,自动为每个轴设置ylim,这使所有系列看起来像它们 即使一个系列随时间增加了1个单位,而另一个系列则增加了5倍,则以相似的速率增加。我一直试图找到一种方法来定义特定于系列的ylim值,但找不到方法。 我知道我可以相对化每个系列,但对于我的实际数据,绝对值非常重要。将所有线条绘制在一个单一的,包含所有内容的ylim中也将无法正常工作,因为它将压缩我尝试绘制的实际数据中的某些时间序列。

有人知道吗?

我要更改的实际图形在此研究website上。该图显示出所有物种都以相同的速度增长,而事实并非如此……

下面是带有数据和带有自动定义的ylim值的图形的示例代码。请注意,由于ylim范围存在很大差异,所有轨迹看起来都具有相同的趋势。

set.seed(0)
#create example dataframe
year=c(2000:2018)
grape_prices=c(seq(from=3.5, to=4.5, length.out = 19))+runif(19)
apple_prices=c(seq(from=3, to=5.5, length.out = 19))+runif(19)*2
mango_prices=c(seq(from=7, to=12, length.out = 19))
DF=data.frame(year, grape_prices, apple_prices, mango_prices)+runif(19)

#find ylims for each line that have roughtly the same range
DF_range_and_lims=as.data.frame(t(apply(DF[,-1], 2, range)))
names(DF_range_and_lims)=c("min", "max")
DF_range_and_lims$range=DF_range_and_lims$max-DF_range_and_lims$min
highest_range=DF_range_and_lims$range[which(DF_range_and_lims$range==max(DF_range_and_lims$range))]
cat("highest range is ", highest_range, "\n")
DF_range_and_lims$ylim_low=floor(DF_range_and_lims$min)
DF_range_and_lims$ylim_high=ceiling(DF_range_and_lims$min+highest_range)
DF_plot_ylims=DF_range_and_lims[,c("ylim_low", "ylim_high")]

cat("These are the ylims I would like to use", "\n")
DF_plot_ylims

#plotly plot with button for series selector
library(plotly)
ay <- list(
  tickfont = list(color = "red"),
  overlaying = "y",
  side = "right")
multi_species_equal_axis <- plot_ly(DF, x = ~year) %>%
  add_lines(y = ~grape_prices, name = "Grape prices") %>%
  add_lines(y = ~apple_prices, name = "Apple_prices", visible=T, color = I('red'), yaxis = "y2") %>% #yaxis = "y2",
  add_lines(y = ~mango_prices, name = "Mango Prices", visible=F, color = I('red'), yaxis = "y2") %>% #yaxis = "y2",

  layout(
    xaxis = list(title = "", domain = c(0.1, 1)),
    updatemenus = list(
      list(
        buttons = list(
          list(method = "restyle",
               args = list("visible", list(TRUE, TRUE, FALSE)),
               label = "Apple prices"),
          list(method = "restyle",
               args = list("visible", list(TRUE, FALSE, TRUE)),
               label = "Mango prices")))),
    yaxis2 = ay,
    yaxis = list(rangemode="normal", title = "Price in R$"))
multi_species_equal_axis

plotly graph without properly scaled ylims

1 个答案:

答案 0 :(得分:1)

因此,经过大量的搜索和反复试验,结果发现在创建与该轴相关的绘图时存在一个论点,该图可用于将一个轴的值​​锚定到另一个轴。因此,在上面的示例中,解决方案非常简单,我们仅将左y轴(蓝色)与右y2轴(红色)的范围绑定在一起。 这是在倒数第二行上配置y轴时完成的:

yaxis = list(rangemode="normal", title = "Price in R$", scaleanchor= "y2"))

这将产生一个图表,显示两个y轴之间的距离差异!

dynamic but anchored graph