如何用Python制作计数准确的Plotly柱状图并自定义颜色与悬停信息
解决Plotly柱状图的颜色与悬停计数问题
我来帮你搞定这几个问题,咱们一步步来:
问题根源分析
你原来的代码fig = px.bar(df, x=df["label"])其实是把每一行数据都当成了单独的柱子,所以每个标签下会有多个高度为1的小柱子,悬停时显示的count=1就是单个数据点的计数,颜色暗淡则是因为Plotly默认给同一类别的不同实例分配了相近的色调。
完整解决方案代码
首先我们先统计标签的实际计数,再基于统计结果画图,同时自定义颜色和悬停内容:
import pandas as pd import plotly.express as px # 构造你的示例数据 data = {"label": ["negative", "negative", "negative", "positive", "positive", "negative", "positive"]} df = pd.DataFrame(data) # 1. 先统计每个标签的总计数 counts_df = df["label"].value_counts().reset_index() counts_df.columns = ["label", "count"] # 重命名列,方便后续调用 # 2. 绘制柱状图,自定义颜色和显示内容 fig = px.bar( counts_df, x="label", y="count", # 用统计后的计数作为y轴 color="label", # 按标签区分颜色 color_discrete_map={"negative": "red", "positive": "blue"}, # 自定义颜色映射 title="正负标签计数统计", labels={"count": "总计数"} # 重命名y轴标签 ) # 3. 自定义悬停模板,显示正确的计数 fig.update_traces( hovertemplate="<b>标签类型:</b> %{x}<br><b>总计数:</b> %{y}<extra></extra>" ) # 可选:调整柱子之间的间距 fig.update_layout(bargap=0.2) fig.show()
关键步骤说明
- 统计计数:用
value_counts()得到每个标签的实际总数,转换成结构化的DataFrame,这样Plotly就能直接画出对应高度的柱子,而不是每个数据点一个柱子。 - 自定义颜色:通过
color_discrete_map参数精准指定negative为红色、positive为蓝色,完全符合你的需求。 - 修正悬停内容:用
hovertemplate自定义悬停时显示的文本,把默认的count=1替换成实际的总计数%{y},<extra></extra>用来去掉默认的系列名称。
这样画出来的图就是两个并排的柱子,红色对应negative(计数4),蓝色对应positive(计数3),悬停时也能正确显示实际的总数值啦!
内容的提问来源于stack exchange,提问作者Domi
相关产品推荐
相关产品推荐

