为了账号安全,请及时绑定邮箱和手机立即绑定

在matplotlib条形图上添加值标签

在matplotlib条形图上添加值标签

白衣染霜花 2019-08-12 17:14:32
在matplotlib条形图上添加值标签我被困在一些感觉应该相对容易的事情上。我下面的代码是基于我正在研究的更大项目的示例。我没有理由发布所有细节,所以请接受我带来的数据结构。基本上,我正在创建一个条形图,我只是想弄清楚如何在条形图上添加值标签(在条形图的中心,或者在它上面)。一直在寻找网络上的样本,但没有成功实现我自己的代码。我相信解决方案要么是'text',要么是'annotate',但我:a)不知道使用哪一个(一般来说,还没弄清楚何时使用哪个)。b)无法看到要么呈现价值标签。非常感谢您的帮助,我的代码如下。提前致谢!import numpy as npimport pandas as pdimport matplotlib.pyplot as pltpd.set_option('display.mpl_style', 'default') %matplotlib inline# Bring some raw data.frequencies = [6, 16, 75, 160, 244, 260, 145, 73, 16, 4, 1]# In my original code I create a series and run on that, # so for consistency I create a series from the list.freq_series = pd.Series.from_array(frequencies)x_labels = [108300.0, 110540.0, 112780.0, 115020.0, 117260.0, 119500.0,             121740.0, 123980.0, 126220.0, 128460.0, 130700.0]# Plot the figure.plt.figure(figsize=(12, 8))fig = freq_series.plot(kind='bar')fig.set_title('Amount Frequency')fig.set_xlabel('Amount ($)')fig.set_ylabel('Frequency')fig.set_xticklabels(x_labels)
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

首先freq_series.plot返回一个轴而不是一个数字,以便让我的答案更加清晰我已经改变了你的给定代码来引用它,ax而不是fig与其他代码示例更加一致。


您可以从ax.patches成员中获取绘图中生成的条形列表。然后,您可以使用此matplotlib库示例中演示的技术使用该ax.text方法添加标签。


import numpy as np

import pandas as pd

import matplotlib.pyplot as plt


# Bring some raw data.

frequencies = [6, 16, 75, 160, 244, 260, 145, 73, 16, 4, 1]

# In my original code I create a series and run on that, 

# so for consistency I create a series from the list.

freq_series = pd.Series.from_array(frequencies)


x_labels = [108300.0, 110540.0, 112780.0, 115020.0, 117260.0, 119500.0,

            121740.0, 123980.0, 126220.0, 128460.0, 130700.0]


# Plot the figure.

plt.figure(figsize=(12, 8))

ax = freq_series.plot(kind='bar')

ax.set_title('Amount Frequency')

ax.set_xlabel('Amount ($)')

ax.set_ylabel('Frequency')

ax.set_xticklabels(x_labels)


rects = ax.patches


# Make some labels.

labels = ["label%d" % i for i in xrange(len(rects))]


for rect, label in zip(rects, labels):

    height = rect.get_height()

    ax.text(rect.get_x() + rect.get_width() / 2, height + 5, label,

            ha='center', va='bottom')

这会产生一个标记的图,看起来像:


查看完整回答
反对 回复 2019-08-12
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

基于上述(很棒!)答案,我们还可以通过一些调整来制作水平条形图:

# Bring some raw data.frequencies = [6, -16, 75, 160, 244, 260, 145, 73, 16, 4, 1]freq_series = pd.Series(frequencies)y_labels = [108300.0, 110540.0, 112780.0, 115020.0, 117260.0, 119500.0, 
            121740.0, 123980.0, 126220.0, 128460.0, 130700.0]# Plot the figure.plt.figure(figsize=(12, 8))ax = freq_series.plot(kind='barh')ax.set_title('Amount Frequency')ax.set_xlabel('Frequency')ax.set_ylabel('Amount ($)')ax.set_yticklabels(y_labels)ax.set_xlim(-40, 300) # expand xlim to make labels easier to readrects = ax.patches# For each bar: Place a labelfor rect in rects:
    # Get X and Y placement of label from rect.
    x_value = rect.get_width()
    y_value = rect.get_y() + rect.get_height() / 2

    # Number of points between bar and label. Change to your liking.
    space = 5
    # Vertical alignment for positive values
    ha = 'left'

    # If value of bar is negative: Place label left of bar
    if x_value < 0:
        # Invert space to place label to the left
        space *= -1
        # Horizontally align label at right
        ha = 'right'

    # Use X value as label and format number with one decimal place
    label = "{:.1f}".format(x_value)

    # Create annotation
    plt.annotate(
        label,                      # Use `label` as label
        (x_value, y_value),         # Place label at end of the bar
        xytext=(space, 0),          # Horizontally shift label by `space`
        textcoords="offset points", # Interpret `xytext` as offset in points
        va='center',                # Vertically center label
        ha=ha)                      # Horizontally align label differently for
                                    # positive and negative values.plt.savefig("image.png")


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 2739 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信