当前位置: 首页 > 知识库问答 >
问题:

如何在seaborn/matplotlib中打印和注释分组条形图

壤驷涛
2023-03-14

我有一个看起来像这样的数据帧:

我使用条形图表示每行的订阅者。这就是我所做的:

data = channels.sort_values('subscribers', ascending=False).head(5)
chart = sns.barplot(x = 'name', y='subscribers',data=data)
chart.set_xticklabels(chart.get_xticklabels(), rotation=90)
for p in chart.patches:
    chart.annotate("{:,.2f}".format(p.get_height(), '.2f'), (p.get_x() + p.get_width() / 2., p.get_height()), ha = 'center', va = 'center', xytext = (0, 10), textcoords = 'offset points')

现在我想在同一个图中显示每个用户的“video_count”。目标是比较订阅者数量与视频数量的关系。我如何在图表上描述这一点?

共有1个答案

黄锋
2023-03-14
  • 需要使用 .melt 将数据转换为长格式
  • 由于值的刻度,“log”用于y刻度
  • 该示例包括“猫”中的所有类别。
    • 在熔化之前只选择所需的列,或使用 dfl = dfl[dfl.cats.isin(['子', 'vc']) 来过滤所需的“猫”
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # setup dataframe
    data = {'vc': [76, 47, 140, 106, 246],
            'tv': [29645400, 28770702, 50234486, 30704017, 272551386],
            'sub': [66100, 15900, 44500, 37000, 76700],
            'name': ['a', 'b', 'c', 'd', 'e']}
    df = pd.DataFrame(data)
    
        vc        tv    sub name
    0   76  29645400  66100    a
    1   47  28770702  15900    b
    2  140  50234486  44500    c
    
    # convert to long form
    dfl = (df.melt(id_vars='name', var_name='cats', value_name='values')
           .sort_values('values', ascending=False).reset_index(drop=True))
    
      name cats     values
    0    e   tv  272551386
    1    c   tv   50234486
    2    d   tv   30704017
    
    • 使用matplotlib.pyplot.bar_label
    • 。bar_label适用于matplotlibseborn熊猫绘图。
    • 请参阅如何在条形图上添加值标签,以获取更多详细信息和使用.bar_label的示例。
    • 使用seborn v0.11.1进行测试,它使用matplotlib作为绘图引擎。
    # plot
    fig, ax = plt.subplots(figsize=(12, 6))
    sns.barplot(x='name', y='values', data=dfl, hue='cats', ax=ax)
    ax.set_xticklabels(ax.get_xticklabels(), rotation=0)
    ax.set_yscale('log')
    
    for c in ax.containers:
        # set the bar label
        ax.bar_label(c, fmt='%.0f', label_type='edge', padding=1)
        
    # pad the spacing between the number and the edge of the figure
    ax.margins(y=0.1)
    

      < li >在版本3.4.2之前使用< code > matplotlib < li >注意,使用< code >。注释和< code >。patches比< code >更详细。条形标签。
    # plot
    fig, ax = plt.subplots(figsize=(12, 6))
    sns.barplot(x='name', y='values', data=dfl, hue='cats', ax=ax)
    ax.set_xticklabels(chart.get_xticklabels(), rotation=0)
    ax.set_yscale('log')
    
    for p in ax.patches:
        ax.annotate(f"{p.get_height():.0f}", (p.get_x() + p.get_width() / 2., p.get_height()),
                    ha='center', va='center', xytext =(0, 7), textcoords='offset points')
    

 类似资料:
  • 我遇到了一个关于Python中matplotlib的棘手问题。我想用几个代码创建一个分组条形图,但是图表出错了。你能给我一些建议吗?代码如下。 这个代码模块的输出真是一团糟。但我所期望的应该像图中的条形图。你能告诉我代码中哪一点不正确吗?

  • 我需要注释水平条形图。我能够使用matplotlib网站上显示的示例来注释垂直条形图,但是对于 horizonatl 的类似想法似乎不起作用。 以下是垂直方向的小型工作示例: 以下是我想要使用的代码,但不适用于水平图形 感谢任何帮助,提前感谢!

  • 问题内容: 如何添加值的标签以显示在条形图中的条形上方: 问题答案: 捕获绘图所在的轴,然后将其作为普通对象进行操作。将值放在条形上方将是这样的:

  • 我有以下数据集,并使用Matplotlib绘制了一个堆叠条形图。 以下是生成图形的代码: 我需要注释图形中的值。例如,我需要每个条的值出现在图形的条内。请参阅下面的示例

  • 以下代码为与分组变量关联的每个“色调”值生成一个带有不同颜色条的条形图: 我想更改颜色,以便属于相同分组值的所有条都具有相同的颜色。也就是说,的前两个栏应该是橙色,而的最后两个栏应该是蓝色。 我已经尝试了'sns.barplot()的参数。但是,除非我遗漏了什么,否则这允许我指定每个色调级别的颜色,但不能单独指定分组变量的值。 我也看了一下这个相关问题的答案,它问了一些关于。公认的答案建议使用轴的

  • 如何添加要显示在条形图中条形图上方的值标签: