将单个标签嵌入到 plotly express 直方图中
Posted
技术标签:
【中文标题】将单个标签嵌入到 plotly express 直方图中【英文标题】:Embedding individual label into plotly express histogram 【发布时间】:2021-12-17 14:09:27 【问题描述】:我想将单个标签嵌入到 plotly express 直方图的每个条形中。
举个例子:
import plotly.express as px
import pandas as pd
df = pd.DataFrame('name':['label1', 'label2','label3', 'label4', 'label1'],
'val1':[1,2,1,2,1])
px.histogram(df, x='val1', nbins=3)
是否可以让['label1', 'label3']
、['label2', 'label4']
分别出现在直方图的第 1 列和第 2 列?
【问题讨论】:
【参考方案1】: 也可以在 pandas 中计算数据 在图上添加附加信息作为注释import plotly.express as px
import pandas as pd
df = pd.DataFrame('name':['label1', 'label2','label3', 'label4', 'label1'],
'val1':[1,2,1,2,1])
fig = px.histogram(df, x='val1', nbins=3)
# work out bins in pandas...
df2 = (
df.groupby(pd.cut(df["val1"], bins=3))
.agg(
count=("name", "size"),
labels=("name", lambda s: ",".join(s.drop_duplicates().tolist())),
)
.assign(
l=lambda d: [i.left for i in d.index.values],
r=lambda d: [i.right for i in d.index.values],
x=lambda d: [(i.left+i.right)/2 for i in d.index.values],
count=lambda d: d["count"].astype(float)
)
).fillna("")
# add text to histogram
for r in df2.iterrows():
fig.add_annotation(text=r[1]["labels"], x=(r[1]["l"]+r[1]["r"])/2, y=r[1]["count"]+.2, showarrow=False)
fig
【讨论】:
非常感谢您的解决方案 Rob。非常感激!然而,我简化了这个问题,因为我的数据集在 Val1 中有更多的类,并且每个类中还有许多对单个 labels 的详细描述。所以更准确地说,我想看看当鼠标悬停在每个条上时,前 10 个标签是否会以交互方式出现。 很简单 - 只有 5 个标签:labels=("name", lambda s: ",".join(s.drop_duplicates().tolist()[0:5]))
如果你想构建为悬停,我会去更改为 px.bar 而不是直方图。您在 df2 中拥有生成简单条形图所需的一切以上是关于将单个标签嵌入到 plotly express 直方图中的主要内容,如果未能解决你的问题,请参考以下文章
Plotly:如何在 plotly express 折线图中更改图例的变量/标签名称?
Plotly:如何使用 plotly express 自定义 xaxis 刻度标签?