密谋:如何在直方图上显示单个值?

时间:2020-05-24 13:30:29

标签: python plotly

我正在尝试使用plotly创建动态图。我想绘制已汇总的数据计数(使用groupby)。 我想按颜色(甚至可能按列)对图进行分面。问题是我希望将数值计数显示在每个栏中。使用直方图,我得到了平滑条,但是我找不到如何显示计数: enter image description here

使用条形图,我可以显示计数,但不能获得平滑的条,并且对于整个条,计数不会出现在整个条上,而是在组成该条的每种情况下 enter image description here

这是我的小程序代码

val = pd.DataFrame(data2.groupby(["program", "gender"])["experience"].value_counts())
px.bar(x=val.index.get_level_values(0), y=val, color=val.index.get_level_values(1), barmode="group", text=val)

直方图基本相同。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:3)

px.histogram似乎没有text属性。因此,如果您愿意在制作图之前进行任何装仓,则可以使用px.Bar。通常,您使用px.Bar(... text = <something>)将文本应用于条形图。但这会为您提供所有数据子类别的文本描述的结果。但是,由于我们知道px.Bar按照源的组织顺序添加数据和注释,因此我们可以简单地将文本更新为使用fig.data[-1].text = sums应用的 last 子类别。剩下的唯一挑战是对某些数据进行处理以检索正确的总和。

情节:

enter image description here

使用数据示例完成代码:

import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

# data
df = pd.DataFrame({'x':['a', 'b', 'c', 'd'],
                       'y1':[1, 4, 9, 16],
                       'y2':[1, 4, 9, 16],
                       'y3':[6, 8, 4.5, 8]})
df = df.set_index('x')

# calculations
# column sums for transposed dataframe
sums= []
for col in df.T:
    sums.append(df.T[col].sum())

# change dataframe format from wide to long for input to plotly express
df = df.reset_index()
df = pd.melt(df, id_vars = ['x'], value_vars = df.columns[1:])

fig = px.bar(df, x='x', y='value', color='variable')
fig.data[-1].text = sums

fig.update_traces(textposition='inside')
fig.show()

答案 1 :(得分:0)

如果您的第一个图形带有图形对象库,则可以尝试:

# Use textposition='auto' for direct text
fig=go.Figure(data[go.Bar(x=val.index.get_level_values(0),
 y=val, color=val.index.get_level_values(1), 
 barmode="group", text=val, textposition='auto',
    )])