文章目录
- 完善统计图形
- 1 添加图例和标题
- 1.1 图例和标题的设置方法
- 1.2 案例1--图例的展示样式的调整
- 1.3 案例2--标题的展示样式的调整
- 1.4 案例3--带图例的饼图
- 2 调整刻度范围和刻度标签
- 2.1 调整刻度范围和刻度标签的方法
- 2.2 子区函数--subplot()
- 2.3 案例--逆序设置坐标轴刻度标签
- 3 向统计图形添加表格
完善统计图形
1 添加图例和标题
在绘图区域中可能会出现多个图形,而这些图形如果不加以说明,观察者则很难识别出这些图形的主要内容。因此,我们需要给这些图形添加标签说明,用以标记每个图形所代表的的内容。方便观察者辨识,这个标签说明就是图例。
同样,如果观察者想要清楚地了解绘图区域中的内容。就需要给绘图区域添加文本内容用以说明绘图区域的主要内容,标题就可以让观察者清楚地知道绘图区域的核心信息和图标内容。
1.1 图例和标题的设置方法
下面通过python代码来演示图例和标题的设置方法,重点讲解函数legend()和title()的使用方法。
# -*- coding:utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
x = np.linspace(-2*np.pi, 2*np.pi, 200)
y = np.sin(x)
y1 = np.cos(x)
plt.plot(x, y, label=r"$\sin(x)$")
plt.plot(x, y1, label=r"$\cos(x)$")
plt.legend(loc="lower left")
plt.title("正弦和余弦函数的折线图")
plt.show()
这里我们使用的是matplotlib自带的TeX功能来实现对数学表达式支持的,用TeX对文本内容进行渲染,通过使用r"$$“模式,将表达式\sin和\cos嵌入一对美元符号之间。一般而言,对于在r”$text\text2$“中的非数学表达式文本text1会以斜体形式输出,并且最终输出时就会呈现印刷级别的文档效果。需要说明的是,在字符串r”$text\text2$“的开始之处有一个标记"r”,表示该字符串是raw strings,字符串按照TeX规范进行解析。
1.2 案例1–图例的展示样式的调整
不仅图例的显示位置可以改变,图例的展示样式也可以进行调整,比如图例的外边框、图例中的文本标签的排列位置和图例的投影效果等方面。这些图例的展示样式都是通过图例函数legend()的关键字参数实现的。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2.1, 0.1)
y = np.power(x, 3)
y1 = np.power(x, 2)
y2 = np.power(x, 1)
plt.plot(x, y, ls="-", lw=2, label="$x^{3}$")
plt.plot(x, y1, ls="-", lw=2, c="r", label="$x^{2}$")
plt.plot(x, y2, ls="-", lw=2, c="y", label="$x^{1}$")
plt.legend(loc="upper left",bbox_to_anchor=(0.05, 0.95), ncol=3,
title="power function", shadow=True, fancybox=True)
plt.show()
图例函数legend()的关键字参数主要有位置参数loc、线框位置参数bbox_to_anchor、图例标签内容的标题参数title、线框阴影shadow和线框圆角处理参数fancybox等。对于位置参数loc不仅可以使用字符串还可以使用字符串对应的数字。
位置参数值 | 位置数值 |
---|---|
upper right | 1 |
upper left | 2 |
lower left | 3 |
lower right | 4 |
center left | 6 |
center right | 7 |
lower center | 8 |
upper center | 9 |
center | 10 |
1.3 案例2–标题的展示样式的调整
针对标题的展示样式,可以通过title()的关键字参数得以实现,这些关键字参数包括字体样式、字体大小、字体风格和字体颜色等文本属性。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2, 2, 1000)
y = np.exp(x)
plt.plot(x, y, ls="-", lw=2, color="g")
plt.title("center demo")
plt.title("Left Demo", loc="left",
fontdict={"size": "xx-large", "color": "r", "family": "Times New Roman"})
plt.title("Right Demo", loc="right", family="Comic Sans MS",
size=20, style="oblique", color="c")
plt.show()
1.4 案例3–带图例的饼图
为饼图添加图例,从而实现绘图区域的清爽布局。
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
elements = ["面粉", "砂糖", "奶油", "草莓酱", "坚果"]
weight = [40, 15, 20, 10, 15]
colors = ["#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00"]
wedges, texts, autotexts = plt.pie(weight,
autopct="%3.1f%%",
textprops=dict(color="w"),
colors=colors)
plt.legend(wedges,elements,fontsize=12, title="配料表",
loc="center left",bbox_to_anchor=(0.91, 0, 0.3, 1)) # 设置图例的位置和大小
plt.setp(autotexts, size=15, weight="bold")
plt.setp(texts, size=12)
plt.title("野果派配料表", fontsize=20)
plt.show()
通过调用图例函数"plt.legend(wedges, elements)",就可以将饼片外部的文本标签放在图例中,而各饼片的数值仍在饼片内部。函数legend()的参数wedges和elements分别表示饼片实例列表和文本标签列表,而且这两个参数要一起配合才能将外部文本标签放在图例中。
2 调整刻度范围和刻度标签
刻度范围是绘图区域中坐标轴的取值区间,包括x轴和y轴的取值区间。刻度范围是否合适直接决定绘图区域中图形展示效果的优劣。因此,调整刻度范围对可视化效果的影响非常明显。同理,刻度标签的样式也会对可视化效果造成影响。如果可以根据具体的数据结构和数据形式采用合适的刻度标签样式,那么不仅可以将数据本身的特点很好的地展示出来,还可以让可视化效果变得更加理想。
2.1 调整刻度范围和刻度标签的方法
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2*np.pi, 2*np.pi, 200)
y = np.sin(x)
plt.subplot(211)
plt.plot(x, y)
plt.subplot(212)
plt.xlim(-2*np.pi, 2*np.pi)
plt.xticks([-2*np.pi, -3*np.pi/2, -np.pi, -1*np.pi/2, 0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi],
[r'$-2\pi$',r'$-3\pi/2$', r'$-\pi$',r'$-\pi/2$', r'$0$', r'$\pi/2$', r'$\pi$', r'$3\pi/2$',r'$2\pi$'])
plt.plot(x, y)
plt.show()
下半部分是改进后的正弦曲线,我们通过xlim()函数来改变x轴的刻度范围,使得绘图区域变得更加紧凑。又通过xticks()来改变刻度标签,使得图形内容更加直观,便于观察和理解。
2.2 子区函数–subplot()
这个函数专门用来绘制几何形状相同的网格区域,子区顾名思义就是将画布分成若干个子画布,这些子画布就构成了几何形状规则且对称的矩形绘图区域,然后在这些区域上分别绘制图形。例如,subplot(211)和subplot(212)代表首先在画布上分隔出一个2行1列的画布格式,然后在一个2行1列的画布格式上分别绘制图形1和图形2。
2.3 案例–逆序设置坐标轴刻度标签
我们通过调整xlim()的参数内容来实现逆序展示刻度标签的可视化需求。这样,我们就能够根据具体需求来灵活调整坐标轴刻度标签的数值排序方向,轻松实现升序和降序刻度标签的标记需求。
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
time = np.arange(1, 11, 0.5)
machinePower = np.power(time, 2) + 0.7
plt.plot(time, machinePower, linestyle='-', linewidth=2, color='r')
plt.xlim(10, 1)
plt.xlabel('使用年限')
plt.ylabel('机器功率')
plt.title('机器功率随使用年限的变化')
plt.grid(ls=':', lw=1, color='gray', alpha=0.5)
plt.show()
3 向统计图形添加表格
通过matplotlib可以绘制精美的统计图形,数据可视化的主要作用就是直观地解释数据,以使观察者可以发现数据背后的规律或者变化趋势。有时为了更加全面地凸显数据的规律和特点,需要将统计图形和数据表格结合使用。
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
labels = "A难度水平", "B难度水平", "C难度水平", "D难度水平"
students = [0.35, 0.15, 0.20, 0.30]
explode = (0.1, 0.1, 0.1, 0.1)
colors = ["#377eb8", "#4daf4a", "#984ea3", "#ff7f00"]
plt.pie(students, explode=explode,
labels=labels, autopct='%1.1f%%',
startangle=45, shadow=True, colors=colors)
plt.title("选择不同难度测试试卷的学生百分比")
colLabels = ["A难度水平", "B难度水平", "C难度水平", "D难度水平"]
rowLabels = ["学生选择试卷人数"]
studentValues = [[350, 150, 200, 300]]
colColors = ["#377eb8", "#4daf4a", "#984ea3", "#ff7f00"]
plt.table(cellText=studentValues,
cellLoc="center",
colWidths=[0.1] * 4,
colLabels=colLabels,
colColours=colColors,
rowLabels=rowLabels,
rowLoc="center",
loc="bottom")
plt.show()
我们主要添加了table()函数,该函数各参数含义如下:
- cellText: 表格的数值,将源数据按照行进行分组,每组数据放在列表里存储,所有组数据再放在列表里存储
- cellLoc: 表格中数据的对齐方式,可左对齐、居中和右对齐
- colWidths: 表格中每列的宽度
- colLabels: 表格中每列的列名称
- colColours: 表格中每列的类名称所在单元格的颜色
- rowLabels: 表格每行的行名称
- rowLoc: 表格每行的行名称对齐方式
- loc: 表格在画布中的位置
通过上面的表格,我们就可以清楚地知道学生选择不同难度试卷的实际人数,从相对和绝对绝对分别考察试卷的难易程度对学生选择试卷的影响情况,使得后续的分析结论能够更加客观和全面地反映试卷难度对学生考试的影响。想要举一反三的同学可以试试将前面讲的饼图外部文本添加到图例中,让图形更加直观。