0
点赞
收藏
分享

微信扫一扫

matplotlib中直方图的简单使用及美化

那小那小 2022-04-27 阅读 74

在图中指定位置显示信息:

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;纵坐标为当前区间样本占总样本的比例;

此时输出的结果为:
直方图1

对数据进行分组
  • 在处理数据时需要对数据进行分组,当组数太多时会使得规律不明显,组数过少会导致统计误差变大;
  • 组数:
    • 当数据在一百以内时,按数据多少常分为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()

此时显示结果为:
直方图2

使用条形图方法绘制直方图
  • 宽度更改:条形图的宽度默认为0.8,更改为1;
    • plt.bar(x,y,width=1)
  • 对x轴的数字位置进行移动,根据实际调整;
举报

相关推荐

0 条评论