首页 文章

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

提问于
浏览
2

我正在创建一个图形图形,其中有一个按钮,用于选择要显示的系列,这是一个基本的图形功能 . 我的问题是该图的目的是显示变异性的差异和系列之间的差异增长率 . 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 回答

  • 1

    因此,经过大量的搜索和反复试验,结果表明在创建与轴相关的图形图时存在一个争论,可以用来将一个轴的值锚定到另一个轴 . 所以在上面的例子中,解决方案非常简单,我们只是将左y轴(蓝色)的范围束缚到右y2轴(红色) . 在第二行到最后一行配置y轴时完成此操作:

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

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

    dynamic but anchored graph

相关问题