在图中指定位置显示信息:
plt.text(x,y,s,family,fontsize,style,color)
- x,y:注释内容位置
- s:注释文本内容
- family:字体
- fontsize:字体大小
- style:字体样式 normal、italic(斜体)、oblique(斜体)
- color:颜色
直方图
适用于
- 连续分布数字
- 统计分布状态
- 未经处理的数据
对二十部电影的时长分布进行绘图
from tkinter.font import names
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc("font", family="KaiTi")
movies = [
{'name':'控方证人', 'time':116},
{'name':'十二怒汉', 'time':52},
{'name':'盗梦空间', 'time':148},
{'name':'切腹', 'time':133},
{'name':'窃听风暴', 'time':137},
{'name':'重生之死', 'time':105},
{'name':'搏击俱乐部', 'time':139},
{'name':'红辣椒', 'time':90},
{'name':'惊魂记', 'time':109},
{'name':'致命魔术', 'time':130},
{'name':'杀人回忆', 'time':132},
{'name':'第六感', 'time':107},
{'name':'绿里奇迹', 'time':189},
{'name':'追随', 'time':69},
{'name':'电话谋杀案', 'time':105},
{'name':'心理游戏', 'time':103},
{'name':'看不见的客人', 'time':106},
{'name':'禁闭岛', 'time':138},
{'name':'七宗罪', 'time':127},
{'name':'蝴蝶效应', 'time':113},
]
i = 0
times = []
for movie in movies:
times.append(movies[i].get("time"))
i += 1
plt.hist(times, 4)
plt.savefig("picture/直方图1.png")
plt.show()
- 绘图指令为
plt.hist()
- 传入参数:
- 数据;
- 分组数量;
- density=1,stacked=True;纵坐标为当前区间样本占总样本的比例;
- 传入参数:
此时输出的结果为:
对数据进行分组
- 在处理数据时需要对数据进行分组,当组数太多时会使得规律不明显,组数过少会导致统计误差变大;
- 组数:
- 当数据在一百以内时,按数据多少常分为5~12组;
- 组距:
- 指每个小组两个端点的距离;
- 组距尽量设置为被极差整除的数字,避免显示错位:
组数 = 极差/组距 = [max(s) - min(s)]/bin_width
代码:
bin_width = 3
num_bins = int((max(s)-min(s))/bin_width)
plt.hist(s, num_bins)
# 直接传入数据和组数
plt.hist(s, [min(s)+i*bin_width for i in range(num_bins)])
在此基础上重新绘制
from tkinter.font import names
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc("font", family="KaiTi")
movies = [
{'name':'控方证人', 'time':116},
{'name':'十二怒汉', 'time':52},
{'name':'盗梦空间', 'time':148},
{'name':'切腹', 'time':133},
{'name':'窃听风暴', 'time':137},
{'name':'重生之死', 'time':105},
{'name':'搏击俱乐部', 'time':139},
{'name':'红辣椒', 'time':90},
{'name':'惊魂记', 'time':109},
{'name':'致命魔术', 'time':130},
{'name':'杀人回忆', 'time':132},
{'name':'第六感', 'time':107},
{'name':'绿里奇迹', 'time':189},
{'name':'追随', 'time':69},
{'name':'电话谋杀案', 'time':105},
{'name':'心理游戏', 'time':103},
{'name':'看不见的客人', 'time':106},
{'name':'禁闭岛', 'time':138},
{'name':'七宗罪', 'time':127},
{'name':'蝴蝶效应', 'time':113},
]
i = 0
s = []
for movie in movies:
s.append(movies[i].get("time"))
i += 1
bin_width = 5
num_bins = int((max(s)-min(s))/bin_width)
# plt.hist(s, num_bins)
plt.hist(s, [min(s)+i*bin_width for i in range(num_bins)], density=1, stacked=True)
plt.xticks(list(range(min(s),max(s)))[::bin_width], rotation=45)
plt.grid(alpha=0.5)
plt.savefig("picture/hist_2.png")
plt.show()
此时显示结果为:
使用条形图方法绘制直方图
- 宽度更改:条形图的宽度默认为0.8,更改为1;
plt.bar(x,y,width=1)
- 对x轴的数字位置进行移动,根据实际调整;