如何在R的Plotly次Y轴显示最小、最大及间隔5的刻度
Plotly次Y轴刻度显示问题解决
问题描述
使用Plotly绘制双Y轴图表时,主Y轴(对应val1数据)的刻度显示和缩放均正常,但次Y轴(对应val2、val3数据)无任何刻度显示。需求为:
- 次Y轴显示刻度5和10(5是小于val2/val3最小值的最小5的倍数,10是大于其最大值的最小5的倍数)
- 每5个单位显示一个刻度
原代码如下:
data = structure(list(Quarter = c("Q1-19", "Q2-19", "Q3-19", "Q4-19", "Q1-20", "Q2-20", "Q3-20", "Q4-20", "Q1-21", "Q2-21", "Q3-21", "Q4-21", "Q1-22"), val1 = c(-0.104, -0.069, -0.075, 0.1, -0.15, -0.05, -0.0825, 0, 0, 0, 0, 0, 0), val2 = c(8.14554910547994, 8.55275717435675, 8.40632494969184, 7.91931645491084, 7.61926376889051, 7.9804131283696, 7.84841940402634, 8.17523084115879, 8.20048296800237, 8.15037889614863, 8.49192165017997, 8.12639342202955, 8), val3 = c(8.9935262047237, 9.14278022237807, 9.03679932091872, 8.71124810040193, 8.76215333422409, 8.37943378478808, 8.49591400485852, 8.17523084115879, 8.20048296800237, 8.15037889614863, 8.49192165017997, 8.12639342202955, 8)), row.names = c(NA, -13L), class = c("tbl_df", "tbl", "data.frame")) quarters = data %>% select(Quarter) %>% pull() xform <- list(categoryorder = "array", categoryarray = quarters) fig <- plot_ly(data, x = ~Quarter, y = ~val1, name = 'val1', type = 'scatter', mode = 'lines', line = list(dash = 'dot', width = 5))%>% layout(xaxis = xform) ay <- list( tick0 = 0, dtick = 20, overlaying = "y", side = "right", title = "val2", showgrid = FALSE) fig = fig %>% add_trace(y = ~val2, name = ' val2', yaxis = 'y2', line = list(color = "rgb(122, 157, 07)", width = 5, dash = 'line')) %>% add_trace(y = ~val3, name = 'val3', yaxis = 'y2', line = list(color = "red", width = 5, dash = 'line')) %>% layout( title = list(text = "values"), yaxis2 = ay, xaxis = list(title=" ", tickmode = "array", tickvals = sort(c(0, seq( length(quarters)-1,1, -4))), tickangle = 270, showgrid = FALSE), yaxis = list(title="val1") ) fig
问题图表截图:

问题原因
原代码中次Y轴的dtick=20设置过大,且未指定轴的范围(range),导致生成的刻度(0、20、40...)完全超出val2/val3数据的取值范围(7.6~9.1),因此无法在图表中显示。
解决方案
修改次Y轴的配置参数,具体调整如下:
- 设置
range = c(5, 10):固定轴的范围为需求的5到10,确保刻度在可视区间内 - 调整
dtick=5:实现每5个单位显示一个刻度 - 设置
tick0=5:让刻度从5开始,对应需求的起始刻度
修改后的次Y轴配置代码:
ay <- list( tick0 = 5, dtick = 5, range = c(5, 10), overlaying = "y", side = "right", title = "val2", showgrid = FALSE)
完整修改后代码
data = structure(list(Quarter = c("Q1-19", "Q2-19", "Q3-19", "Q4-19", "Q1-20", "Q2-20", "Q3-20", "Q4-20", "Q1-21", "Q2-21", "Q3-21", "Q4-21", "Q1-22"), val1 = c(-0.104, -0.069, -0.075, 0.1, -0.15, -0.05, -0.0825, 0, 0, 0, 0, 0, 0), val2 = c(8.14554910547994, 8.55275717435675, 8.40632494969184, 7.91931645491084, 7.61926376889051, 7.9804131283696, 7.84841940402634, 8.17523084115879, 8.20048296800237, 8.15037889614863, 8.49192165017997, 8.12639342202955, 8), val3 = c(8.9935262047237, 9.14278022237807, 9.03679932091872, 8.71124810040193, 8.76215333422409, 8.37943378478808, 8.49591400485852, 8.17523084115879, 8.20048296800237, 8.15037889614863, 8.49192165017997, 8.12639342202955, 8)), row.names = c(NA, -13L), class = c("tbl_df", "tbl", "data.frame")) quarters = data %>% select(Quarter) %>% pull() xform <- list(categoryorder = "array", categoryarray = quarters) fig <- plot_ly(data, x = ~Quarter, y = ~val1, name = 'val1', type = 'scatter', mode = 'lines', line = list(dash = 'dot', width = 5))%>% layout(xaxis = xform) # 修改后的次Y轴配置 ay <- list( tick0 = 5, dtick = 5, range = c(5, 10), overlaying = "y", side = "right", title = "val2", showgrid = FALSE) fig = fig %>% add_trace(y = ~val2, name = ' val2', yaxis = 'y2', line = list(color = "rgb(122, 157, 07)", width = 5, dash = 'line')) %>% add_trace(y = ~val3, name = 'val3', yaxis = 'y2', line = list(color = "red", width = 5, dash = 'line')) %>% layout( title = list(text = "values"), yaxis2 = ay, xaxis = list(title=" ", tickmode = "array", tickvals = sort(c(0, seq( length(quarters)-1,1, -4))), tickangle = 270, showgrid = FALSE), yaxis = list(title="val1") ) fig
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

