Plotly横轴刻度值与数据不匹配问题求助
问题:Plotly水平条形图x轴刻度与实际数据不匹配
我是Plotly的新用户,绘制的图表中x轴(标签/刻度)值与指定的x轴数据不匹配。
我的代码如下:
import pandas as pd import psycopg2 as odb import plotly.express as px from urllib.parse import quote_plus from sqlalchemy import create_engine connection = odb.connect(...) q = """select SOMEATTR, OTHERATTR, SOMETYPE from SOMETABLE....""" uri = f"postgresql+psycopg2://{quote_plus(user)}:{quote_plus(pw)}@{host}:{port}/{db}" alchemyEngine = create_engine(uri) df = pd.read_sql(q, connection) fig = px.bar(df, x="SOMEATTR", y="OTHERATTR", color="SOMETYPE", orientation='h') fig.update_xaxes(rangemode="normal") fig.write_html('first_figure.html', auto_open=True)
我的示例中SOMEATTR值范围为0到7.2808,但图表在条形图末端显示的刻度标签为900。我期望x轴标签/刻度范围为0到7或8,而非0-900。
能否有人帮我让x轴值匹配实际的x数据范围(0、1、2……8等)?是否可以通过添加副轴来实现?
解决方案
问题根源是你搞反了水平条形图的参数逻辑:在Plotly Express的bar函数中,orientation='h'会交换x/y参数对应的轴:
- 垂直条形图(默认):x轴对应
x参数,y轴对应y参数(条形高度的数值) - 水平条形图:y轴对应
x参数,x轴对应y参数(条形长度的数值)
你的代码把SOMEATTR设为x参数,加上orientation='h'后,x轴实际显示的是y参数OTHERATTR的数值范围(0-900),而非你期望的SOMEATTR。
方案1:修正参数对应关系(保留水平条形图)
如果需要水平条形图,且希望x轴显示SOMEATTR的范围(条形长度对应SOMEATTR),只需互换x/y参数:
fig = px.bar(df, x="OTHERATTR", y="SOMEATTR", color="SOMETYPE", orientation='h') fig.update_xaxes(rangemode="normal", range=[0, 8]) # 可选:手动锁定x轴到0-8的范围
方案2:改用垂直条形图
如果不需要水平条形图,直接去掉orientation='h'参数,默认的垂直条形图会让x轴对应SOMEATTR的数值:
fig = px.bar(df, x="SOMEATTR", y="OTHERATTR", color="SOMETYPE") fig.update_xaxes(rangemode="normal", range=[0, 8]) # 可选:手动设置x轴范围
方案3:强制锁定x轴范围(治标方案)
如果不想修改参数逻辑,也可以直接强制设置x轴的显示范围:
fig = px.bar(df, x="SOMEATTR", y="OTHERATTR", color="SOMETYPE", orientation='h') fig.update_xaxes(rangemode="normal", range=[0, 8]) # 强制x轴显示0到8
但这个方法没解决根源问题,优先推荐前两个方案。
关于副轴
完全不需要添加副轴,这只是参数对应关系的问题,副轴会让图表复杂化,毫无必要。
内容的提问来源于stack exchange,提问作者cm1
相关产品推荐
相关产品推荐

