是否可以将 plot_ly 轴限制为绘图的特定比例?

Is it possible to constrain plot_ly axis to certain proportions of the plot?

我正在使用 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 年 12 月 2 日更新:测试新的范围计算。可能找到了一个偷工减料的方法。

简而言之,到目前为止的答案是否定的。感谢@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 <- runif(10, min=-2, max=2) NrmPolct1 <- c(.015,.005,.66,.32,.225,.025,.03,.05,0 ,0)(如果范围不正确,以确保遮挡)我们得到