如何解决R语言Plotly中线图坐标轴零线消失问题?
问题
在R语言中使用Plotly绘制折线图,数据包含NA值,已实现折线从非NA值处开始绘制,但出现两个问题:
- x轴零线消失,即使设置
zeroline = TRUE也无法显示; - 尝试添加x为月份范围、y=0的轨迹补全零线,给该轨迹设置
hovermode = 'none'后,悬停一月或十二月时仍会显示“trace 0 : 0 hL”的提示信息。
附实现代码:
library(data.table) library(plotly) dataBeverage <- data.table( month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), volume = c(NA, NA, NA, 3000, 2450, 3200, 4678, 2435, 1342, 1731, 2340, 3500)) p <- plot_ly(data = dataBeverage, x = ~month, y = ~volume, type = 'scatter', mode = 'lines', line = list(color='#17BECF', shape = 'spline'))%>% layout( hovermode = 'x unified', separators = ', ', xaxis = list( range = c(min(dataBeverage$month),max(dataBeverage$month)), title = '', tickangle=-40, ticktext = list('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'Octobre', 'November', 'December'), tickvals = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), showgrid = FALSE ), yaxis = list( title = list(text = 'Montly volume', standoff = 15L), ticksuffix = ' hL', tickformat = ',d' )) p
解决方案
1. 恢复x轴零线
Plotly会自动根据y轴数据范围调整可视区域,由于你的数据y值全为正数且最小值远大于0,默认不会显示y=0的零线。只需手动指定y轴范围包含0,并开启zeroline即可:
在layout的yaxis参数中添加以下配置:
yaxis = list( title = list(text = '月度销量', standoff = 15L), ticksuffix = ' hL', tickformat = ',d', zeroline = TRUE, # 开启零线显示 range = c(0, max(dataBeverage$volume, na.rm = TRUE)) # 强制y轴从0开始 )
无需额外添加y=0的轨迹,就能直接显示x轴对应的零线。
2. 解决额外轨迹的悬停提示问题
如果必须通过添加轨迹补全零线,注意单个轨迹的悬停控制参数是hoverinfo = 'none',而非全局布局的hovermode。同时可关闭该轨迹的图例显示:
# 添加零线轨迹 p <- p %>% add_trace( x = ~month, y = 0, type = 'scatter', mode = 'lines', line = list(color = '#000000'), hoverinfo = 'none', # 关闭该轨迹的悬停提示 showlegend = FALSE # 隐藏图例项 )
修改后的完整代码
library(data.table) library(plotly) dataBeverage <- data.table( month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), volume = c(NA, NA, NA, 3000, 2450, 3200, 4678, 2435, 1342, 1731, 2340, 3500)) p <- plot_ly(data = dataBeverage, x = ~month, y = ~volume, type = 'scatter', mode = 'lines', line = list(color='#17BECF', shape = 'spline')) %>% layout( hovermode = 'x unified', separators = ', ', xaxis = list( range = c(min(dataBeverage$month),max(dataBeverage$month)), title = '', tickangle=-40, ticktext = list('一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'), tickvals = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), showgrid = FALSE ), yaxis = list( title = list(text = '月度销量', standoff = 15L), ticksuffix = ' hL', tickformat = ',d', zeroline = TRUE, range = c(0, max(dataBeverage$volume, na.rm = TRUE)) )) p
内容的提问来源于stack exchange,提问作者ju0325
相关产品推荐
相关产品推荐

