Plotly绘图Y轴零刻度网格线缺失问题求助
Plotly Y轴零刻度网格线缺失修复方案
问题现象
使用Plotly绘制折线图时,Y轴零刻度对应的网格线未显示,出现异常空白区域,调整常规网格参数(如showgrid=True)后仍无法生效。
原代码与复现数据
绘图函数
def plot_dictionary_lines(data_dict, title, colors, dtick_y, y_title): tilt_values = list(data_dict.keys()) orientation_values = list(data_dict[tilt_values[0]].keys()) fig = go.Figure() for i,tilt in enumerate(tilt_values): tilt_data = data_dict[tilt] y_values = [] for orientation in orientation_values: y_values.append(tilt_data[orientation]) fig.add_trace(go.Scatter(x=orientation_values, y=y_values, mode='lines', name=tilt, line=dict(color=colors[i]))) fig.update_layout(title=title, xaxis_title='Orientation') fig.update_layout(yaxis=dict(title=y_title, dtick=dtick_y, minor=dict(ticks="inside", showgrid=True))) fig.update_layout(title=title, title_font_size=12, title_x=0.5, margin=dict(l=5, r=5, t=30, b=5)) fig.update_layout(showlegend=True, plot_bgcolor= 'white' ) fig.update_xaxes(showline=True, mirror=True, linewidth=2, linecolor='black', gridcolor='grey', gridwidth=1) fig.update_yaxes(showline=True, mirror=True, linewidth=2, linecolor='black', gridcolor='grey', gridwidth=1) fig.update_layout(legend_title_text='Tilt (deg)') fig.show()
复现数据
data_dict = {'20': {'0': -29.993976613550426, '90': -9.982751500722712, '180': 0.0, '270': -16.409959148158066}, '40': {'0': -51.454747907503716, '90': -13.263266344556737, '180': 0.0, '270': -23.372002876678337}, '60': {'0': -60.76495332385845, '90': -13.362989512932888, '180': 0.0, '270': -25.197913842540597}} title = "Solar production sold entirely, respect south" color_codes = { "10colors": [ '#cce542', '#98d956', '#66cb69', '#2fba79', '#00a884', '#009589', '#008286', '#006e7d', '#185b6d', '#2a4858'] } colors = color_codes["10colors"] d_ticky = 5 y_title = "%"
问题原因
Plotly自动计算Y轴范围时,零刻度刚好处于轴范围的上边界,导致对应的网格线被隐藏,常规网格参数无法强制显示边界处的刻度线。
修复方案
手动指定Y轴范围,确保零刻度落在轴范围内部而非边界。通过计算数据的极值,扩展Y轴范围即可实现。
修改后的绘图函数
def plot_dictionary_lines(data_dict, title, colors, dtick_y, y_title): tilt_values = list(data_dict.keys()) orientation_values = list(data_dict[tilt_values[0]].keys()) # 计算所有Y值的最小值,用于扩展轴范围 all_y_values = [] for tilt in tilt_values: all_y_values.extend(list(data_dict[tilt].values())) min_y = min(all_y_values) fig = go.Figure() for i,tilt in enumerate(tilt_values): tilt_data = data_dict[tilt] y_values = [] for orientation in orientation_values: y_values.append(tilt_data[orientation]) fig.add_trace(go.Scatter(x=orientation_values, y=y_values, mode='lines', name=tilt, line=dict(color=colors[i]))) fig.update_layout(title=title, xaxis_title='Orientation') fig.update_layout(yaxis=dict(title=y_title, dtick=dtick_y, minor=dict(ticks="inside", showgrid=True))) fig.update_layout(title=title, title_font_size=12, title_x=0.5, margin=dict(l=5, r=5, t=30, b=5)) fig.update_layout(showlegend=True, plot_bgcolor= 'white' ) fig.update_xaxes(showline=True, mirror=True, linewidth=2, linecolor='black', gridcolor='grey', gridwidth=1) # 手动设置Y轴范围,让零处于内部区间 fig.update_yaxes(showline=True, mirror=True, linewidth=2, linecolor='black', gridcolor='grey', gridwidth=1, range=[min_y - 5, 5]) # 扩展上边界到5,确保零不在边界 fig.update_layout(legend_title_text='Tilt (deg)') fig.show()
效果说明
修改后,Y轴零刻度处于轴范围内部,对应的网格线会正常显示,解决空白区域问题。
内容的提问来源于stack exchange,提问作者marcelsa
相关产品推荐
相关产品推荐

