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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:13:18