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
相关产品推荐
相关产品推荐

