是否可以将 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 这可能吗?到目前为止,我在布局部分使用 scaleanchor
和 scaleratio
以及 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)
(如果范围不正确,以确保遮挡)我们得到
我正在使用 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 这可能吗?到目前为止,我在布局部分使用 scaleanchor
和 scaleratio
以及 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)
(如果范围不正确,以确保遮挡)我们得到