【matplotlib】4-完善统计图形

完善统计图形

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()

sincos
这里我们使用的是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()

power
图例函数legend()的关键字参数主要有位置参数loc、线框位置参数bbox_to_anchor、图例标签内容的标题参数title、线框阴影shadow和线框圆角处理参数fancybox等。对于位置参数loc不仅可以使用字符串还可以使用字符串对应的数字。

位置参数值位置数值
upper right1
upper left2
lower left3
lower right4
center left6
center right7
lower center8
upper center9
center10

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()

demo

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()

pie
通过调用图例函数"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()

pi
下半部分是改进后的正弦曲线我们通过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()

machine

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
我们主要添加了table()函数该函数各参数含义如下

  • cellText: 表格的数值将源数据按照行进行分组每组数据放在列表里存储所有组数据再放在列表里存储
  • cellLoc: 表格中数据的对齐方式可左对齐、居中和右对齐
  • colWidths: 表格中每列的宽度
  • colLabels: 表格中每列的列名称
  • colColours: 表格中每列的类名称所在单元格的颜色
  • rowLabels: 表格每行的行名称
  • rowLoc: 表格每行的行名称对齐方式
  • loc: 表格在画布中的位置

通过上面的表格我们就可以清楚地知道学生选择不同难度试卷的实际人数从相对和绝对绝对分别考察试卷的难易程度对学生选择试卷的影响情况使得后续的分析结论能够更加客观和全面地反映试卷难度对学生考试的影响。想要举一反三的同学可以试试将前面讲的饼图外部文本添加到图例中让图形更加直观。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6