Python 之 Matplotlib 柱状图(竖直柱状图和水平柱状图)直方图和饼状图
Posted 虚心求知的熊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 之 Matplotlib 柱状图(竖直柱状图和水平柱状图)直方图和饼状图相关的知识,希望对你有一定的参考价值。
文章目录
- 在开始,我们先引入 matplotlib 和 numpy 库。
from matplotlib import pyplot as plt
import numpy as np
- 对基本配置进行设置,将中文字体设置为黑体,不包含中文负号,分辨率为 100,图像显示大小设置为 (5,3)。
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100
plt.rcParams['figure.figsize'] = (5,3)
一、柱状图
- 柱状图是一种用矩形柱来表示数据分类的图表。
- 柱状图可以垂直绘制,也可以水平绘制。
- 它的高度与其所表示的数值成正比关系。
- 柱状图显示了不同类别之间的比较关系,图表的水平轴 X 指定被比较的类别,垂直轴 Y 则表示具体的类别值
二、竖直柱状图
matplotlib.pyplot.bar(x, height, width: float = 0.8, bottom = None, *, align: str = ‘center’, data = None, **kwargs)
- 其参数具体如下含义:
- x 表示 x 坐标,数据类型为 float 类型,一般是通过 np.arange() 生成的固定步长列表。
- height 表示柱状图的高度,也就是 y 坐标值,数据类型为 float 类型,一般为一个列表,包含生成柱状图的所有 y 值。
- width 表示柱状图的宽度,取值在 0~1 之间,默认值为 0.8。
- bottom 表示柱状图的起始位置,也就是 y 轴的起始坐标,默认值为 None。
- align 表示柱状图的中心位置,“center”,“lege” 边缘,默认值为 ’center’。
- color 表示柱状图颜色,默认为蓝色。
- alpha 表示透明度,取值在 0~1 之间,默认值为 1。
- label 表示标签,设置后需要调用 plt.legend() 生成。
- edgecolor 表示边框颜色 (ec)。
- linewidth 表示边框宽度,浮点数或类数组,默认为 None (lw)。
- tick_label 表示柱子的刻度标签,字符串或字符串列表,默认值为 None。
- linestyle 表示线条样式 (ls)。
1. 基本的柱状图
- 我们可以简单画一个柱状图用以观察,x 轴数据通过 range 函数生成,y 轴数据随便设定一个数组即可。
import matplotlib.pyplot as plt
x = range(5)
data = [5, 20, 15, 25, 10]
plt.title("基本柱状图")
plt.grid(ls="--", alpha=0.5)
plt.bar(x, data)
- (1) bottom 参数。
- bottom 参数表示的是柱状图的起始位置,也就是 y 轴的起始坐标,默认值为 None。
- 我们仍采用和上述例子相同的数据,但与之不同的是,我们对 y 轴数据的起始点进行修改。
- 这里需要注意的是,bottom 参数设定的数组与 y 轴数据的参数是一一对应的,而且,两个数组的形状要相同。
import matplotlib.pyplot as plt
x = range(5)
data = [5, 20, 15, 25, 10]
plt.title("基本柱状图")
plt.grid(ls="--", alpha=0.5)
plt.bar(x, data, bottom=[10, 20, 5, 0, 10])
- (2) 柱状图颜色。
- 关于柱状图的颜色,我们也采用上述的数据进行操作,此时,不设置柱状图的 bottom 参数,同时,将柱状图的颜色设置为绿色。
import matplotlib.pyplot as plt
x = range(5)
data = [5, 20, 15, 25, 10]
plt.title("设置柱状图颜色")
plt.grid(ls="--", alpha=0.5)
plt.bar(x, data ,facecolor="green")
#plt.bar(x, data ,color="green")
- 那么,在某些特定的情况下,柱状图的单一颜色并不利于我们后续的观察,因此,我们可以使用 facecolor 函数,分别对每个柱状图进行颜色的设置。
import matplotlib.pyplot as plt
x = range(5)
data = [5, 20, 15, 25, 10]
plt.title("color参数设置柱状图不同颜色")
plt.grid(ls="--", alpha=0.5)
plt.bar(x, data ,color=['r', 'g', 'b'])
- (3) 柱状图描边。
- 描边的相关的关键字参数为:
- edgecolor 或 ec。
- linestyle 或 ls。
- linewidth 或 lw。
- 具体可见如下具体实例。
import matplotlib.pyplot as plt
data = [5, 20, 15, 25, 10]
plt.title("设置边缘线条样式")
plt.bar(range(len(data)), data, ec='r', ls='--', lw=2)
2. 同位置多柱状图
- 在同一个 x 轴位置绘制多个柱状图,主要是通过调整柱状图的宽度和每个柱状图 x 轴的起始位置。
- 例如,我们有 2022 年冬奥会挪威、德国、中国、美国和瑞典的金银铜牌数和总奖牌数。
- 对此,我们需要绘制如下图形:
- 对该柱状图进行分析,可得:
- (1) 本实例需要对 x 轴进行计算,因此需要将 x 轴转数值。
- (2) 确定同一 x 轴中,每个柱状图 x 轴的起始位置。
- (3) 需要设置图形的宽度。
- (4) 图形 2 的起始位置 = 图形 1 起始位置 + 图形的宽度。
- (5) 图形 3 的起始位置 = 图形 1 起始位置 + 2 倍图形的宽度。
- (6) 需要给每个柱状图循环显示文本内容。
- (7) 需要显示图例。
- 具体柱状图绘制过程如下:
- 首先,我们需要导入国家和各个国家的金银铜奖牌数。
countries = ['挪威', '德国', '中国', '美国', '瑞典']
gold_medal = [16, 12, 9, 8, 8]
silver_medal = [8, 10, 4, 10, 5]
bronze_medal = [13, 5, 2, 7, 5]
- 此时,如果我们直接进行绘制的话,会发现每个国家的奖牌柱状图发生了重叠,并且每个柱状图的宽度也过大。
- 这是因为他们都默认 y 轴的起始坐标也就是 bottom 参数为 0,宽度参数由于没有设置,默认是 0.8。
plt.bar(countries, gold_medal,color="gold")
plt.bar(countries,silver_medal,color="silver")
plt.bar(countries,bronze_medal,color="red")
- 针对上述在绘图过程当中出现的问题和最后结果的样图,我们需要将每个国家的金银铜牌柱状图分别画在一起,所以我们需要对 x 轴的国家参数进行坐标计算。
- 由于字符串不可以直接进行算术运算,因此,我们使用 np.arange 将他们转化成数组,然后在返回字符串国家,并将柱状图的宽度 width 设置为 0.2
x = np.arange(len(countries))
print(x)
width = 0.2
#[0 1 2 3 4]
- 随后,我们确定每个国家的金银铜牌柱状图的起始位置。
- 金牌呃起始位置就是每个国家对应的 x 数值,银牌的起始位置就是每个国家对应的 x 数值再加上金牌柱状图的宽度,铜牌的起始位置与银牌相似,加上两倍的金牌位置即可(这里我们将每个柱状图的宽度均设置为 0.2)。
gold_x = x
silver_x = x + width
bronze_x = x + 2 * width
- 在上述运行完成后,分别绘制图形即可。
plt.bar(gold_x,gold_medal,width=width,color="gold")
plt.bar(silver_x,silver_medal,width=width,color="silver")
plt.bar(bronze_x,bronze_medal,width=width, color="saddlebrown")
- 此时,我们注意到,绘制柱状图的横坐标是数字还没有返回我们的国家参数。
- 对此,我们需要将 x 轴的坐标变回来。
plt.xticks(x+width, labels=countries)
- 最后,我们显示出每一个柱状图的高度参数和图例,就得到了我们需要的图像。
for i in range(len(countries)):
plt.text(gold_x[i],gold_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.text(silver_x[i],silver_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.text(bronze_x[i],bronze_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.legend()
- 代码汇总:
#库导入
from matplotlib import pyplot as plt
import numpy as np
#参数设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100
plt.rcParams['figure.figsize'] = (5,3)
#国家和奖牌数据导入
countries = ['挪威', '德国', '中国', '美国', '瑞典']
gold_medal = [16, 12, 9, 8, 8]
silver_medal = [8, 10, 4, 10, 5]
bronze_medal = [13, 5, 2, 7, 5]
#将横坐标国家转换为数值
x = np.arange(len(countries))
width = 0.2
#计算每一块的起始坐标
gold_x = x
silver_x = x + width
bronze_x = x + 2 * width
#绘图
plt.bar(gold_x,gold_medal,width=width,color="gold",label="金牌")
plt.bar(silver_x,silver_medal,width=width,color="silver",label="银牌")
plt.bar(bronze_x,bronze_medal,width=width, color="saddlebrown",label="铜牌")
#将横坐标数值转换为国家
plt.xticks(x + width,labels=countries)
#显示柱状图的高度文本
for i in range(len(countries)):
plt.text(gold_x[i],gold_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.text(silver_x[i],silver_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.text(bronze_x[i],bronze_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
#显示图例
plt.legend(loc="upper right")
- 其他知识点:在 Matplotlib 中旋转 X 轴刻度标签文本。
- (1) plt.xticks(rotation= ) 旋转 Xticks 标签文本。
- (2) fig.autofmt_xdate(rotation= ) 旋转 Xticks 标签文本。
- (3) ax.set_xticklabels(xlabels, rotation= ) 旋转 Xticks 标签文本。
- (4) plt.setp(ax.get_xticklabels(), rotation=) 旋转 Xticks 标签文本。
- (5) ax.tick_params(axis=‘x’, labelrotation= ) 旋转 Xticks 标签文本。
3. 堆叠柱状图
- 所谓堆叠柱状图就是将不同数组别的柱状图堆叠在一起,堆叠后的柱状图高度显示了两者相加的结果值。 如图:
- 对该图进行分析可得:
- (1) 金牌榜的起始高度为:铜牌数据+银牌数据。
- (2) 银牌榜的起始高度为:银牌高度。
- (3) 铜牌榜的起始高度为:0。
- (4) 起始位置的数据相加需要使用 numpy 的相关知识。
- (6) 需要确定柱状图的颜色。
- (7) 显示图例。
- 具体的绘制办法,跟上一个同位置多柱状图是完全类似的,区别在于我们需要注意 bottom 的数值计算,同时,金银铜牌的起始坐标是完全相同的。
#库导入
from matplotlib import pyplot as plt
import numpy as np
#参数设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100
plt.rcParams['figure.figsize'] = (5,3)
#国家和奖牌数据输入、柱状图宽度设置
countries = ['挪威', '德国', '中国', '美国', '瑞典']
gold_medal = np.array([16, 12, 9, 8, 8])
silver_medal = np.array([8, 10, 4, 10, 5])
bronze_medal = np.array([13, 5, 2, 7, 5])
width = 0.3
#绘图
plt.bar(countries, gold_medal, color='gold', label='金牌',
bottom=silver_medal + bronze_medal,width=width)
plt.bar(countries, silver_medal, color='silver', label='银牌', bottom=bronze_medal,width=width)
plt.bar(countries, bronze_medal, color='#A0522D', label='铜牌',width=width)
#设置y轴标签,图例和文本值
plt.ylabel('奖牌数')
plt.legend(loc='upper right')
for i in range(len(countries)):
max_y = bronze_medal[i]+silver_medal[i]+gold_medal[i]
plt.text(countries[i], max_y, max_y, va="bottom", ha="center")
三、水平柱状图
1. 基本的柱状图
- 通过调用 Matplotlib 中的 barh() 函数可以生成水平柱状图。
- barh() 函数的用法与 bar() 函数的用法基本一样,只是在调用 barh() 函数时使用 y 参数传入 y 轴数据,使用 width 参数传入代表条柱宽度的数据。
- ha(horizontal alignment)控制文本的 x 位置参数表示文本边界框的左边,中间或右边。
- va(vertical alignment)控制文本的 y位置参数表示文本边界框的底部,中心或顶部。
plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
- 例如,我们以竖直柱状图当中的国家金牌数为例进行绘制。
countries = ['挪威', '德国', '中国', '美国', '瑞典']
gold_medal = np.array([16, 12, 9, 8, 8])
plt.barh(countries, width=gold_medal)
2. 同位置多柱状图
- 在同一个 y 轴位置绘制多个柱状图,主要是通过调整柱状图的宽度和每个柱状图 y 轴的起始位置。
- 例如,我们有最近三天当中 3 部电影的票房变化的数据。
movie = ['新蝙蝠侠', '狙击手', '奇迹笨小孩']
real_day1 = [4053, 2548, 1543]
real_day2 = [7840, 4013, 2421]
real_day3 = [8080, 3673, 1342]
- 对此,我们需要绘制如下图像。
- 对该图进行分析可得:
- (1) 由于牵扯高度的计算,因此先将 y 轴转换为数值型。
- (2) 需要设置同图形的高度。
- (3) 计算每个图形高度的起始位置。
- (4) 绘制图形。
- (5) 替换 y 轴数据。
- 由于牵扯计算,因此将数据转 numpy 数组,水平的用位置多柱状图绘制方法与竖直的完全相同,在此便不过多叙述了。
#库导入
from matplotlib import pyplot as plt
import numpy as np
#参数设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100
plt.rcParams['figure.figsize'] = (5,3)
#数据的输入
movie = ['新蝙蝠侠', '狙击手', '奇迹笨小孩']
real_day1 = np.array( [4053, 2548, 1543])
real_day2 = np.array([7840, 4013, 2421])
real_day3 = np.array([8080, 3673, 1342])
#y轴转换为数值型
num_y = np.arange(len(movie))
#设置同图形的高度
height = 0.2
#计算每个图形高度的起始位置
movie1_start_y = num_y
movie2_start_y = num_y + height
movie3_start_y = num_y + 2 * height
#绘制图形
plt.barh(movie1_start_y, real_day1, height=height)
plt.barh(movie2_start_y, real_day2, height=height)
plt.barh(movie3_start_y, real_day3, height=height)
# 计算宽度值和y轴值,替换y轴数据
plt.yticks(num_y + height, movie)
3. 堆叠柱状图
- 水平的堆叠柱状图与竖直的堆叠柱状图类似都是将不同数组别的柱状图堆叠在一起,堆叠后的柱状图高度显示了两者相加的结果值。 如图:
- 对该图进行分析可得:
- (1) 确定图形距离左侧的位置。
- (2) 设置同一宽度。
- (3) 绘制图形设置 left 参数。
- (4) 标注数据。
- 由于过程当中牵扯到计算,因此需要将数据转 numpy 数组。
- 其他部分与绘制竖直堆叠柱状图的过程类似,在此便不过多进行叙述。
#库导入
from matplotlib import pyplot as plt
import numpy as np
#参数设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 100
plt.rcParams['figure.figsize'] = (5,3)
#数据的输入
movie = ['新蝙蝠侠', '狙击手', '奇迹笨小孩']
real_day1 = np.array( [4053, 2548, 1543])
real_day2 = np.array([7840, 4013, 2421])
real_day3 = np.array([8080, 3673, 1342])
#确定距离左侧以上是关于Python 之 Matplotlib 柱状图(竖直柱状图和水平柱状图)直方图和饼状图的主要内容,如果未能解决你的问题,请参考以下文章
Python matplotlib绘制条形柱状图并添加数据标签
Pyhon数据分析20——matplotlib可视化之柱状图