【问题标题】:Add data labels to Seaborn factor plot将数据标签添加到 Seaborn 因子图
【发布时间】:2016-09-12 06:45:18
【问题描述】:

我想在 Seaborn 生成的因子图中添加数据标签。这是一个例子:

import pandas as pd
from pandas import Series, DataFrame
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

titanic_df = pd.read_csv('train.csv')
sns.factorplot('Sex',data=titanic_df,kind='count')

如何将“计数”值添加到图表上每个条的顶部?

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    你可以这样做:

    import math
    # Set plotting style
    sns.set_style('whitegrid')
    
    # Rounding the integer to the next hundredth value plus an offset of 100
    def roundup(x):
        return 100 + int(math.ceil(x / 100.0)) * 100 
    
    df = pd.read_csv('train.csv')
    sns.factorplot('Sex', data=df, kind='count', alpha=0.7, size=4, aspect=1)
    
    # Get current axis on current figure
    ax = plt.gca()
    
    # ylim max value to be set
    y_max = df['Sex'].value_counts().max() 
    ax.set_ylim([0, roundup(y_max)])
    
    # Iterate through the list of axes' patches
    for p in ax.patches:
        ax.text(p.get_x() + p.get_width()/2., p.get_height(), '%d' % int(p.get_height()), 
                fontsize=12, color='red', ha='center', va='bottom')
    
    plt.show()
    

    【讨论】:

    • 我仍在找出部分答案以调整代码(我想在标签下编号)。你能解释一下for循环吗?谢谢!
    • 感谢您的回答。但是,当有 Hue 参数时,我会出错。请看下面的错误: ValueError Traceback (most recent call last) in 8 # 遍历轴的补丁列表 9 for p in ax.patches: ---> 10 ax.text(p.get_x() + p.get_width()/2., p.get_height(), '%d' % int(p.get_height()), 11 fontsize=12, color='red' , ha='center', va='bottom') 12 ValueError: cannot convert float NaN to integer
    【解决方案2】:

    你可以做一些更简单的事情

    plt.figure(figsize=(4, 3))
    plot = sns.catplot(x='Sex', y='count', kind='bar', data=titanic_df)
    
    # plot.ax gives the axis object
    # plot.ax.patches gives list of bars that can be access using index starting at 0
    
    for i, bar in enumerate(plot.ax.patches):
        h = bar.get_height()
        plot.ax.text(
            i, # bar index (x coordinate of text)
            h+10, # y coordinate of text
            '{}'.format(int(h)),  # y label
            ha='center', 
            va='center', 
            fontweight='bold', 
            size=14)
    

    【讨论】:

      【解决方案3】:

      @nickil-maveli 的上述回答简直太棒了。 这只是为了在您将数据标签添加到条形图时增加一些关于参数的清晰度(根据@user27074 在 cmets 中的要求)

       # loop through all bars of the barplot
      for nr, p in enumerate(ax.patches):
      
          # height of bar, which is basically the data value
          height = p.get_height() 
      
          # add text to specified position
          ax.text(
              # bar to which data label will be added 
              # so this is the x-coordinate of the data label
              nr, 
      
              # height of data label: height / 2. is in the middle of the bar
              # so this is the y-coordinate of the data label
              height / 2., 
      
              # formatting of data label
              u'{:0.1f}%'.format(height), 
      
              # color of data label
              color='black', 
      
              # size of data label
              fontsize=18, 
      
              # horizontal alignment: possible values are center, right, left
              ha='center', 
      
              # vertical alignment: possible values are top, bottom, center, baseline
              va='center'
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-12
        • 2022-11-24
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        相关资源
        最近更新 更多