pandas 如何在使用“melt”分组的海运计数图上获取高于条形图的值

fdx2calv  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(176)

我有一个海运计数图,但不是彩色条,我需要的价值高于每个酒吧。我的输入是pandas数据框。

ax = sns.countplot(x="variable", hue="value", data=pd.melt(dfs))

这里,DFS具有用于不同列的许多条目。
例如,这里的“男人”在蓝色条上方,“女人”在棕色条上方,“孩子”在绿色条上方,而不是颜色描述。

qyzbxkaa

qyzbxkaa1#

有时候,不去寻找调整seaborn的方法更容易,而是直接使用matplotlib并从头开始构建图表。
在这里,我们可以假设有一个名为counts的 Dataframe ,它看起来像

hue     c    m    w
class              
A      20   31   29
B      40  112   63
C      85  203  117

其中索引是沿着x轴的位置,并且列是不同的色调。在下文中,groupedbarplot是一个函数,用于将此类 Dataframe 作为输入并将条形图绘制为组,此外还为每个条形图添加标签。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)

def groupedbarplot(df, width=0.8, annotate="values", ax=None, **kw):
    ax = ax or plt.gca()
    n = len(df.columns)
    w = 1./n
    pos = (np.linspace(w/2., 1-w/2., n)-0.5)*width
    w *= width
    bars = []
    for col, x in zip(df.columns, pos):
        bars.append(ax.bar(np.arange(len(df))+x, df[col].values, width=w, **kw))
        for val, xi in zip(df[col].values, np.arange(len(df))+x):
            if annotate:
                txt = val if annotate == "values" else col
                ax.annotate(txt, xy=(xi, val), xytext=(0,2), 
                            textcoords="offset points",
                            ha="center", va="bottom")
    ax.set_xticks(np.arange(len(df)))
    ax.set_xticklabels(df.index)
    return bars

df = pd.DataFrame({"class" : np.random.choice(list("ABC"), size=700, p=[.1,.3,.6]),
                   "hue" : np.random.choice(["m", "w" ,"c"], size=700, p=[.5,.3,.2])})

counts = df.groupby(["class", "hue"]).size().unstack()

groupedbarplot(counts, annotate="col")
plt.show()

我们也可以直接标记值groupedbarplot(counts, annotate="values")

qgelzfjb

qgelzfjb2#

您可以使用ax.bar_label()在条形图顶部添加注解。
使用您的代码的示例:

for bars, hue_label in zip(ax.containers, pd.melt(dfs).value.unique()):
    ax.bar_label(bars, labels=[hue_label]*len(bars))

基于图像的示例:

for bars, hue_label in zip(ax.containers, df.who.unique()):
    ax.bar_label(bars, labels=[hue_label]*len(bars))

可以使用plt.legend([],[], frameon=False)删除图例。

相关问题