【问题标题】:Is it possible to constrain plot_ly axis to certain proportions of the plot?是否可以将 plot_ly 轴约束到绘图的某些比例?
【发布时间】:2022-01-08 07:00:38
【问题描述】:

我正在使用 plot_ly 库在同一 x 轴上绘制 r 中的两种不同类型的数据。我有两个独立的 y 轴。这里的数据是一个快速模型,用于表示我正在使用的数据集。我有一系列解释变量(即实际值 1-10)、它们的系数以及它们在虚构模型中出现的归一化次数,以及填充向量以制作数据框的 NA 值:

require(tidyverse)
require(data.table)
require(stringr)
require(plotly)
require(processx)

Actuals <-c(1,2,3,4,5,6,7,8,9,10)       
set.seed(10)
UniqCoef1 <- runif(10, min=-1, max=1)    
NrmPolct1 <- c(.015,.005,.33,.32,.225,.025,.03,.05,NA ,NA)
dataframe1 <- data.frame(NrmPolct1,UniqCoef1,Actuals)

为了确定它们各自 y 和 y2 轴的范围,我根据系数的最大值构建了比例因子:

sclfctr1    <- ((.33*1.02)/.20)

然后绘制数据:

plot1 <- plot_ly(dataframe1) %>%
            add_trace(x=~Actuals, y=~UniqCoef1, type="scatter", mode="markers", name="Coef Values") %>%
            add_bars(x=~Actuals, y=~NrmPolct1, yaxis="y2", name="% Polcy Count") %>%
            layout(plot_bgcolor='#D0CFC9',
                    yaxis=list(scaleanchor="x", scaleratio=5,title="Coefficients", zeroline = FALSE,
                                range=c((((max(UniqCoef1)*1.02)-(max(UniqCoef1)*1.02)+(min(UniqCoef1)*.98))/.80),max(UniqCoef1)*1.02), 
                                tickvals=UniqCoef1,standoff=30),
                    yaxis2=list(scaleacnchor="y", scaleratio=.15,overlaying="y",side="right", tickvals=NrmPolct1,range=c(0,sclfctr1),title="% Polcy Count", standoff=30),
                    xaxis=list(tickvals=Actuals,title=paste("actuals"),showgrid=T, standoff=30),
                    title=paste0("# Actuals for State 23, Crop 41."))

我现在使用的方法通常可以防止散点图被条形遮挡,但我希望找到一种方法来限制 y1,使其仅利用绘图区域的前 80% 左右和 y2最底层的 20% 左右。

r 中的 plot_ly 可以吗?到目前为止,我对 scaleanchorscaleratio 的使用以及布局部分中的 range() 参数均无效。

更新:我弄乱了 add_bars() 部分中的 base 参数,结果相同。

更新:域名也没有运气。可能我没有正确使用库中的工具,但我不确定还可以尝试什么。

21 年 2 月 2 日更新:测试新的范围计算。可能已经找到了一个偷工减料的方法。

【问题讨论】:

  • 你看过ggplotly吗?那里可能有一些选择
  • plotly 的主要问题是它严重缺乏可调性,尤其是像这样的东西
  • @neuron,我最初用 ggplot 尝试过这个,而 plot_ly 最终变得容易得多,所以我没有考虑 ggplotly。我会看看这个,看看我能找到什么。
  • 好吧,在 ggplot 中使用辅助轴时,您实际上必须缩放数据,而不是轴。也许是同样的方法?
  • @JDA95 ggplotly 似乎不起作用。我尝试使用ggplot 绘制图并使用ggplotly 并删除了第二个轴

标签: r r-plotly multiple-axes


【解决方案1】:

简而言之,到目前为止的答案是否定的。感谢@neuron 他们通过 ggplotly 的工作并排除了这种方法。

但是,通过一些更好的范围计算并将 NA 值替换为 0,可以使用 layout() 中的 range=c() 参数来确保所有散点不会被条形遮挡。我在上面的数据集以及我的实际数据上对此进行了测试,它在所有 696 个案例中都有效。

sclfctr1    <- ((max(NrmPolct1)*1.02)/.18)

在此处引用包含条形数据的向量以进行适当缩放非常重要。

然后,为 y 轴数据范围、y 轴总范围、轴的填充(这需要针对其他数据集进行调整)以及轴的最大值和最小值创建向量:

 leftAxisDataRange =  (max(UniqCoef1)) - (min(UniqCoef1))

leftAxisTotalRange = (leftAxisDataRange) / 0.78

leftAxisPadding = leftAxisTotalRange * 0.01

leftAxisMax = max(UniqCoef1) + leftAxisPadding

leftAxisMin = (leftAxisMax - leftAxisTotalRange) - leftAxisPadding

最后,只需将上面的范围计算替换为刚刚创建的更美观的向量:

plot_ly(dataframe1) %>%
            add_trace(x=~Actuals, y=~UniqCoef1, yaxis="y", type="scatter", mode="markers", name="Coef Values") %>%
            add_bars(x=~Actuals, y=~NrmPolct1, yaxis="y2", name="% Polcy Count") %>%
            layout(plot_bgcolor='#D0CFC9',
                    yaxis=list(side="left",scaleanchor="x", scaleratio=sclfctr1,title="Coefficients", zeroline = FALSE,
                                tickvals=UniqCoef1,standoff=30,
                                range=c(leftAxisMin,leftAxisMax)),
                    yaxis2=list(scaleacnchor="y", scaleratio=.15,overlaying="y",side="right", tickvals=NrmPolct1,
                                range=c(0,sclfctr1),title="% Polcy Count", standoff=30),
                    xaxis=list(tickvals=Actuals,title=paste("actuals"),showgrid=T, standoff=30),
                    title=paste0("# Test Actuals for State 23, Crop 41."))

UniqCoef1 &lt;- runif(10, min=-2, max=2) NrmPolct1 &lt;- c(.015,.005,.66,.32,.225,.025,.03,.05,0 ,0)(如果范围不正确,确保遮挡)我们得到

【讨论】:

  • 很高兴你明白了这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2011-02-18
相关资源
最近更新 更多