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

带居中标签的堆叠条形图

上官培
2023-03-14

我试图在堆叠条形图中“稳健地”居中数据标签。下面给出了一个简单的代码示例和结果。如您所见,数据标签并不是在所有矩形中都居中。我错过了什么?

import numpy as np
import matplotlib.pyplot as plt

A = [45, 17, 47]
B = [91, 70, 72]

fig = plt.figure(facecolor="white")

ax = fig.add_subplot(1, 1, 1)
bar_width = 0.5
bar_l = np.arange(1, 4)
tick_pos = [i + (bar_width / 2) for i in bar_l]

ax1 = ax.bar(bar_l, A, width=bar_width, label="A", color="green")
ax2 = ax.bar(bar_l, B, bottom=A, width=bar_width, label="B", color="blue")
ax.set_ylabel("Count", fontsize=18)
ax.set_xlabel("Class", fontsize=18)
ax.legend(loc="best")
plt.xticks(tick_pos, ["C1", "C2", "C3"], fontsize=16)
plt.yticks(fontsize=16)

for r1, r2 in zip(ax1, ax2):
    h1 = r1.get_height()
    h2 = r2.get_height()
    plt.text(r1.get_x() + r1.get_width() / 2., h1 / 2., "%d" % h1, ha="center", va="bottom", color="white", fontsize=16, fontweight="bold")
    plt.text(r2.get_x() + r2.get_width() / 2., h1 + h2 / 2., "%d" % h2, ha="center", va="bottom", color="white", fontsize=16, fontweight="bold")

plt.show()

共有1个答案

后源
2023-03-14
  • 以下方法更简洁,易于缩放。
  • 将数据放入熊猫中。数据帧是绘制堆叠条形图的最简单方法。
  • 使用 pandas.DataFrame.plot.bar(堆叠=真)熊猫。数据帧(种类='条形',堆叠=真)是绘制堆叠条形图的最简单方法。
    • 此方法返回一个 matplotlib.axes.Axes 或它们的一个 numpy.ndarray
    import pandas as pd
    import matplotlib.pyplot as plt
    
    A = [45, 17, 47]
    B = [91, 70, 72]
    C = [68, 43, 13]
    
    # pandas dataframe
    df = pd.DataFrame(data={'A': A, 'B': B, 'C': C})
    df.index = ['C1', 'C2', 'C3']
    
         A   B   C
    C1  45  91  68
    C2  17  70  43
    C3  47  72  13
    
      < li >使用< code > matplotlib . py plot . bar _ label ,它会自动将值放在条形的中央。 < li >有关< code >的更多详细信息和示例,请参阅如何在条形图上添加数值标签。条形标签。 < li >使用< code>pandas v1.2.4进行测试,该版本使用< code>matplotlib作为绘图引擎。 < li >如果条形图的某些部分为零,请参见我的回答,其中显示了如何为< code >自定义< code >标签。bar_label()。 < li> ax.bar_label(c,fmt='%0.0f ',label_type='center')会根据需要更改数字格式以不显示小数位。
    ax = df.plot(kind='bar', stacked=True, figsize=(8, 6), rot=0, xlabel='Class', ylabel='Count')
    for c in ax.containers:
    
        # Optional: if the segment is small or 0, customize the labels
        labels = [v.get_height() if v.get_height() > 0 else '' for v in c]
        
        # remove the labels parameter if it's not needed for customized labels
        ax.bar_label(c, labels=labels, label_type='center')
    

    • sebornmatplotlib
    • 的高级api
    • seaborn.barplotapi没有堆叠选项,但它可以用sns.histplotsns.displot实现。
    # create the data frame
    df = pd.DataFrame(data={'A': A, 'B': B, 'C': C, 'cat': ['C1', 'C2', 'C3']})
    
        A   B   C cat
    0  45  91  68  C1
    1  17  70  43  C2
    2  47  72  13  C3
    
    # convert the dataframe to a long form
    df = df.melt(id_vars='cat')
    
      cat variable  value
    0  C1        A     45
    1  C2        A     17
    2  C3        A     47
    3  C1        B     91
    4  C2        B     70
    5  C3        B     72
    6  C1        C     68
    7  C2        C     43
    8  C3        C     13
    
    # plot
    ax = sns.histplot(data=df, x='cat', hue='variable', weights='value', discrete=True, multiple='stack')
    
    # iterate through each container
    for c in ax.containers:
    
        # Optional: if the segment is small or 0, customize the labels
        labels = [v.get_height() if v.get_height() > 0 else '' for v in c]
        
        # remove the labels parameter if it's not needed for customized labels
        ax.bar_label(c, labels=labels, label_type='center')
    

    # plot
    g = sns.displot(data=df, x='cat', hue='variable', weights='value', discrete=True, multiple='stack')
    
    # iterate through each axes
    for ax in g.axes.flat:
    
        # iterate through each container
        for c in ax.containers:
    
            # Optional: if the segment is small or 0, customize the labels
            labels = [v.get_height() if v.get_height() > 0 else '' for v in c]
    
            # remove the labels parameter if it's not needed for customized labels
            ax.bar_label(c, labels=labels, label_type='center')
    

    • 使用. patches方法解压matplotlib.patches.Rectangle对象的列表,堆叠条的每个部分一个。
      • 每个。矩形有提取定义矩形的各种值的方法。
      • 每个。矩形是从左到右,从下到上的顺序,所以所有的。矩形对象,对于每个级别,在遍历时按顺序显示。补丁
      • label_text=f“{高度:0.0f}”将显示不带小数位数的数字
      plt.style.use('ggplot')
      
      ax = df.plot(stacked=True, kind='bar', figsize=(12, 8), rot='horizontal')
      
      # .patches is everything inside of the chart
      for rect in ax.patches:
          # Find where everything is located
          height = rect.get_height()
          width = rect.get_width()
          x = rect.get_x()
          y = rect.get_y()
          
          # The height of the bar is the data value and can be used as the label
          label_text = f'{height}'  # f'{height:.2f}' to format decimal values
          
          # ax.text(x, y, text)
          label_x = x + width / 2
          label_y = y + height / 2
      
          # plot only when height is greater than specified value
          if height > 0:
              ax.text(label_x, label_y, label_text, ha='center', va='center', fontsize=8)
          
      ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)    
      ax.set_ylabel("Count", fontsize=18)
      ax.set_xlabel("Class", fontsize=18)
      plt.show()
      

        < li >要绘制水平条: < ul > < Li > < code > kind = ' barh ' < Li > < code > label _ text = f“{ width }” < li> 如果宽度

 类似资料:
  • 问题内容: 我试图在一个堆积条形图中“稳健地”居中数据标签。A下面给出了简单的代码和结果。如您所见,数据标签并不是所有的矩形都居中。我错过了什么? 问题答案: 你为什么写“va=”bottom“。

  • 我用AndroidPlot在堆叠条形图上有3个数据系列。例如: 在我的图表中,我有3个刻度。例如,标签中显示的值是从序列1 min 1到序列1 max 5,这是序列1的最大值。事实上,总的虚设范围将是 所以我必须展示的标签将从最小5到最大15 知道如何解决这个问题吗?

  • 我有以下不同月份的数据 一月:[1,5,3] Feb:[10,5] 三月:[4,8] 四月:[7] 可能:[3,1,5,0,7] 我想生成如下所示的条形图 现在,我有以下代码,我想知道如何生成如上图所示的条形图。 }); 非常感谢。

  • Highcharts 条形图 以下实例演示了堆叠条形图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。 配置 plotOptions 配置图表堆叠使用 plotOptions.series.stacking,并设置为 "normal"。如果禁用堆叠可设置为 null , "normal" 通过值设置堆叠, "percent" 堆叠则按百分比。 v

  • 我需要一张这样的图表: 我找到了这个示例,但它使用了旧版本的。我尝试使用v2.0,但我不明白。 有人能贴个例子吗?

  • 我想要一张堆叠的条形图,那里有一条阈值线。阈值线以上的条色应为红色,阈值线以下的条色应为绿色。问题是,阈值不是恒定的,对于每个x值,它可能有不同的值。我想随时更新这个阈值,以获得某个x值。如何做到这一点?很明显,柱状图的y参数应该是动态的,也许我应该为它们传递一个函数?请帮我做这个。我也认为阈值应该是一个函数,因为我会更新它