返回 导航

Python / AI

hangge.com

Python - Matplotlib绘图库使用详解3(图像大小、保存图片、中文显示、多图绘制)

作者:hangge | 2022-08-08 08:10

四、图像大小、保存图片、中文显示问题

1,图像大小

figure 方法可以指定创建图形对象的尺寸,具体参数如下:
  • figsize:指定绘图对象的宽度和高度,单位为英寸。
  • dpi:指定绘图对象的分辨率,即每英寸多少个像素,默认值为 80
import matplotlib.pyplot as plt
#图像宽度为4*80=320,高度为2*80=160
plt.figure(figsize=(4,2))
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
#绘制柱状图
plt.bar(langs,students)
plt.show()

2,保存图片

使用 savefig() 方法可以将当前的 Figure 对象保存成图像文件,图像格式由图像文件的扩展名决定。
import matplotlib.pyplot as plt
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
#绘制柱状图
plt.bar(langs,students)
plt.savefig("test.png", dpi=120)

3,解决中文显示问题

    Matplotlib 默认不支持中文字体,这因为 Matplotlib 只支持 ASCII 字符,直接使用中文时,绘制的图像会出现方框中文乱码。如果要使用中文,只需将下面高亮部分代码添加到添加到我们程序中即可:
import matplotlib.pyplot as plt
#解决中文显示问题
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['STZhongsong'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问
#准备数据
langs = ['星期一', '星期二', '星期三', '星期四', '星期五']
students = [23,17,35,29,12]
#绘制柱状图
plt.bar(langs,students)
plt.show()

五、同时绘制多个子图

1,使用 subplot() 函数

(1)有时我们需要将一张画布划分为若干个子区域,然后在这些区域上绘制不同的图形。这个借助 subplot() 函数即可实现,它可以均等地划分画布。
函数格式为 subplot(nrows, ncols, index):
  • nrowsncols 表示要划分几行几列的子区域(nrows * nclos 表示子图数量),index 的初始值为 1,用来选定具体的某个子区域。subplot(2,3,3) 表示在当前画布的右上角创建一个两行三列的绘图区域,同时,选择在第 3 个位置绘制子图。
  • 如果三个参数数都小于 10 的话,可以把它们缩写为一个整数,例如 subplot(323) subplot(3,2,3) 是相同的。
import matplotlib.pyplot as plt
# 第一行的左图
plt.subplot(221) 
plt.bar(['C', 'C++', 'Java'], [12, 34, 45], color='r')
# 第一行的右图
plt.subplot(222) 
plt.bar(['Cat', 'Dog', 'Bird', 'Fish'], [22, 33, 14, 56], color='g')
# 第二整行
plt.subplot(212) 
plt.plot(["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"],[25, 40, 35, 30, 42, 66, 20]) 
plt.show()

(2)如果新建的子图与现有的子图重叠,那么重叠部分的子图将会被自动删除,因为它们不可以共享绘图区域。如果不想覆盖之前的图,需要使用 add_subplot() 函数,
import matplotlib.pyplot as plt
fig = plt.figure()
#添加第1个子图区域
fig.add_subplot(111)
plt.plot(["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"],[25, 66, 35, 30, 42,22, 20]) 
#添加第1个子图区域
fig.add_subplot(233, facecolor='y')
plt.bar(['C', 'C++', 'Java'], [12, 34, 45], color='g')
plt.show()

2,使用 subplots() 函数

    subplots() 函数使用方法和 subplot() 函数类似。其不同之处在于,subplots() 既创建了一个包含子图区域的画布,又创建了一个 figure 图形对象,而 subplot() 只是创建一个包含子图区域的画布。下面样例创建了一个 22 列的子图,并在每个子图中显示 4 个不同的图像。
import matplotlib.pyplot as plt
fig,ax =  plt.subplots(2,2)
# 第一行的左图
ax[0][0].bar(['C', 'C++', 'Java'], [12, 34, 45], color='r')
# 第一行的右图
ax[0][1].bar(['Cat', 'Dog', 'Bird', 'Fish'], [22, 33, 14, 56], color='g')
# 第二行的左图
ax[1][0].plot(["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"],[25, 40, 35, 30, 42, 66, 20])
# 第二行的左图
ax[1][1].plot(["A", "B", "C"],[22, 23, 13])
plt.show()

3,使用 subplot2grid() 函数

(1)subplot2grid() 函数能够在画布的特定位置创建 axes 对象(即绘图区域)。不仅如此,它还可以使用不同数量的行、列来创建跨度不同的绘图区域。与 subplot() subplots() 函数不同,subplot2gird() 函数以非等分的形式对画布进行切分,并按照绘图区域的大小来展示最终绘图结果。
plt.subplot2grid(shape, location, rowspan, colspan) 参数说明如下:
  • shape:把该参数值规定的网格区域作为绘图区域;
  • location:在给定的位置绘制图形,初始位置 (0,0) 表示第 1 行第 1 列;
  • rowsapan:用来设置让子区跨越几行;
  • colspan:用来设置让子区跨越几列。

(2)下面是一个简单的使用样例:
import matplotlib.pyplot as plt
#左上的图
plt.subplot2grid((3,3),(0,0),colspan = 2)
plt.bar(['C', 'C++', 'Java'], [12, 34, 45], color='r')
#左下的图
plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
plt.bar(['Cat', 'Dog', 'Bird', 'Fish'], [22, 33, 14, 56], color='g')
#右侧的图
plt.subplot2grid((3,3),(0,2), rowspan = 3)
plt.plot(["A", "B", "C"],[22, 23, 13])
#调整子图间距
plt.tight_layout() 
plt.show()
评论

全部评论(0)

回到顶部