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

Python Plotly如何手动设置y轴刻度间距、控制刻度高度

问题解决方案

你之前手动设置tickvals无效的核心原因是:该参数仅能指定y轴上显示刻度标签的位置,无法改变原始数值到画布垂直像素的线性映射规则——默认映射下所有数值区间的间距是等比例的,要实现分段差异化间距,需要通过自定义坐标变换的方式实现:

  • 先按照你需要的间距比例,把原始y值映射到一套新的线性坐标上,高密度区间分配更大的坐标跨度,低密度区间分配更小的坐标跨度
  • 绘图时使用变换后的坐标值,再把刻度标签替换回原始数值即可

具体实现步骤

1. 编写坐标映射函数

你可以根据自己的视觉需求调整三个区间的高度占比,以下示例按「0-5占轴总高40%、5-10占总高20%、10-15占总高40%」的规则设置:

import numpy as np

# 原始值 -> 绘图用变换值
def y_transform(y):
    y = np.array(y, dtype=float)
    y_trans = np.zeros_like(y)
    # 0-5区间:拉宽,分配40%轴高
    mask1 = y <= 5
    y_trans[mask1] = y[mask1] * 0.8
    # 5-10区间:压缩,分配20%轴高
    mask2 = (y > 5) & (y <= 10)
    y_trans[mask2] = 4 + (y[mask2] - 5) * 0.4
    # 10-15区间:拉宽,分配40%轴高
    mask3 = y > 10
    y_trans[mask3] = 6 + (y[mask3] - 10) * 0.8
    return y_trans

2. 修改绘图代码

绘图时传入变换后的y值,同时自定义刻度的位置和显示文本,保证轴上显示的是原始数值:

import pandas as pd
import plotly.graph_objects as go
from plotly.graph_objects import Layout

# 数据处理逻辑保持不变
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
df['Date']=pd.to_datetime(df['Date'])    
dfg = df.groupby([pd.Grouper(key='Date', freq='M'), 'direction']).size().to_frame('counts')
dfg.reset_index(inplace=True)

# 自定义要显示的原始刻度值
raw_tick_vals = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
# 转换为绘图坐标上的刻度位置
trans_tick_vals = y_transform(raw_tick_vals)

layout = Layout(
    title='Foo',
    plot_bgcolor='rgba(0,0,0,0)', 
    yaxis = dict(
        tickmode = 'array',
        tickvals = trans_tick_vals,
        ticktext = [str(val) for val in raw_tick_vals],
        range = [0, y_transform([15])[0]] # 轴范围匹配原始0-15区间
    )
)

fig = go.Figure(layout=layout)

for d,c in zip(dfg['direction'].unique(), ['red','green']):
    dfs = dfg.query('direction == @d')
    fig.add_trace(
        go.Scatter(
            x=dfs['Date'],
            y=y_transform(dfs['counts'].values), # 传入变换后的坐标绘图
            customdata=dfs['counts'].values, # 存原始值用于hover提示
            hovertemplate='时间: %{x|%Y-%m}<br>数值: %{customdata}<extra></extra>',
            mode='lines',
            line=dict(
                color=c,
                width=3
            ),
            name=d
        )
    )

fig.show()

调整说明

如果对区间的紧凑/拉宽程度不满意,直接修改y_transform函数里的系数即可:

  • 要让某个区间占更高的垂直空间,就调大该区间的映射系数
  • 要让某个区间更紧凑,就调小该区间的映射系数
  • 修改系数后同步调整yaxis.range参数为最大原始值对应的变换结果即可

内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:57:20