Matplotlib 如何在柱形图上显示数值

Matplotlib 如何在柱形图上显示数值

在数据分析和数据可视化过程中,柱形图是一种非常常用的图表类型。通过柱形图,我们可以清晰地看到不同类别或者变量之间的差异和趋势。然而,在柱形图中只显示柱子本身的高度,如果我们需要更加准确地知道每个柱子的具体值,就需要在每个柱子的顶部显示它的数值。

在Matplotlib中绘制柱形图和添加数据标签是两个分离的任务。因此,在本文中,我们将介绍如何使用Matplotlib在柱形图上方显示数值。

阅读更多:Matplotlib 教程

准备数据

我们先准备一份数据,用于下面的示例:

import numpy as np

data = np.array([26, 33, 21, 17, 13, 29, 35, 19, 27])
labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

这是一个长度为9的一维数组,其中每个元素表示一个类别的数据值,labels则是对应的类别标签。

基础柱形图

我们先绘制一个简单的柱形图,以便后续加上数据标签。只需要使用Matplotlib中的
“`bar“`函数即可。

import matplotlib.pyplot as plt

x_pos = [i for i, _ in enumerate(labels)]

plt.bar(x_pos, data, color='green')
plt.xlabel("Categories")
plt.ylabel("Values")
plt.title("Bar chart with values shown on top")
plt.xticks(x_pos, labels)
plt.show()

这个柱形图中没有显示数据标签,我们下面将介绍三种添加数据标签的方法。

方法一:使用
“`plt.text“`

第一种方法是使用
“`plt.text“`函数,在每个柱子顶部添加数据标签。这个方法需要我们手工指定每个数据标签的位置和文本内容。

fig, ax = plt.subplots()

rects = ax.bar(x_pos, data, color='green')

for rect in rects:
    height = rect.get_height()
    ax.text(rect.get_x() + rect.get_width() / 2., height,
            str(int(height)), ha='center', va='bottom')

plt.xlabel("Categories")
plt.ylabel("Values")
plt.title("Bar chart with values shown on top")
plt.xticks(x_pos, labels)

plt.show()

上面的代码中,我们创建了一个画布和一个子图对象
“`ax“`。“`ax.bar“`函数返回了一个容器“`rects“`,它包含了柱子的位置信息和高度信息,我们可以使用“`rect.get_x()“`和“`rect.get_height()“`获取每个柱子的位置和高度信息。

然后我们通过
“`plt.text“`函数在柱子顶部添加文本。“`plt.text“`函数的参数包括文本的x坐标、y坐标、文本内容、水平方向对齐方式和垂直方向对齐方式。在这个例子中,我们把文本的x坐标设为柱子的中心,y坐标设为柱子高度,然后水平方向和垂直方向对齐方式分别设为中心和底部。

方法二:使用循环和
“`ax.annotate“`

第二种方法是使用循环和
“`ax.annotate“`函数来添加数据标签。这种方法相较于第一种方法更加灵活,因为我们可以通过循环来自动添加每个柱子的数据标签。

fig, ax = plt.subplots()

rects = ax.bar(x_pos, data, color='green')

for i, rect in enumerate(rects):
    ax.annotate(str(int(rect.get_height())), xy=(rect.get_x() + rect.get_width()/2, rect.get_height()),
                xytext=(0, 7), textcoords="offset points",
                ha='center', va='bottom')

plt.xlabel("Categories")
plt.ylabel("Values")
plt.title("Bar chart with values shown on top")
plt.xticks(x_pos, labels)

plt.show()

在这个例子中,我们使用了一个
“`enumerate“`循环,遍历了每个柱子的位置和高度信息。然后我们通过“`ax.annotate“`函数在每个柱子顶部添加文本。“`ax.annotate“`函数的参数和“`plt.text“`类似,不过它还包含了文本箭头的起点和终点坐标。

方法三:使用pandas plot函数

第三种方法是使用Pandas的
“`plot“`函数自动添加数据标签。这种方法相对于前两种方法来说更加简洁,而且不需要手工指定每个数据标签的位置。

import pandas as pd

df = pd.DataFrame({'data': data}, index=labels)
ax = df.plot(kind='bar', color='green')

for i, val in enumerate(df['data'].values):
    ax.text(i, val, int(val), horizontalalignment='center', verticalalignment='bottom')

ax.set(title='Bar chart with Values Shown on Top', xlabel='Categories', ylabel='Values')
plt.show()

这个例子中,我们先把数据转换成一个Pandas的DataFrame对象,然后使用
“`plot“`函数绘制柱形图。最后,我们遍历每个柱子顶端,使用“`ax.text“`函数添加数据标签。

需要注意的是,使用Pandas绘制柱形图的前提是数据已经被转换成了Pandas的DataFrame格式。

总结

本文介绍了三种在Matplotlib柱形图上方添加数据标签的方法:使用
“`plt.text“`、循环和“`ax.annotate“`、以及Pandas的“`plot“`函数。每一种方法都有其优劣和适用场景。希望读者可以根据自己的业务需求和数据特点选择适合自己的方法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程