You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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轴无刻度截图1
次Y轴无刻度截图2

问题原因

原代码中次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:24:42