直方图
在 matplotlib 中,可以通过 plt.hist 函数画直方图
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
#初始化 NumPy 的随机数,并生成以 5 为中心,宽度为正负 10 的 1000 个符合正态分布的随机数,作为我们画图的数据源
np.random.seed(100)
hints = np.random.normal(5, 10, 1000)
#print(hints.mean(), hints.std())
# 创建画布
figure1 = plt.figure(figsize = (10, 5))
figure1.add_subplot(1,1,1)
# 设置轴的属性,轴属性相关的函数都支持fontsize 参数来设置字号
# 这里我们都设置为 14
plt.xlabel("值", fontsize = 14)
plt.ylabel("频率", fontsize = 14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title("正态分布的直方图", fontsize=14)
# 设置画布基本属性:1.显示中文 2.显示负号
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
# 画直方图,分10组,用蓝色来画
plt.hist(hints, bins=10, color=[0,0,1])
plt.show()
运行后如下
这里我们顺便说下
bins 的值代表了要把数据分成几组,也就代表了图上一种会有多少个长方形。bins 越大,体现得就越精确,但相应的分布特征可能就越不明显
比如我们把bin改成50
运行后如下:
可以看到,分组变多后,直方图展示了更多关于原始数据的信息,但是也出现了较多的锯齿,但整体仍然是正态分布的形状
属性2
直方图另外一个非常有用的参数就是 edgecolor,即每个长方形的边框颜色
上面的直方图中间区域是一片蓝,有时候并不利于做进一步的数据分析
这个时候我们可以设置 plt.hist 函数的 edgecolor 属性,来让每个长方形都有一个边框颜色
#coding: utf-8
#date = 2022/9/11
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
#初始化 NumPy 的随机数,并生成以 5 为中心,宽度为正负 10 的 1000 个符合正态分布的随机数,作为我们画图的数据源
np.random.seed(100)
hints = np.random.normal(5, 10, 1000)
#print(hints.mean(), hints.std())
# 创建画布
figure1 = plt.figure(figsize = (10, 5))
figure1.add_subplot(1,1,1)
# 设置轴的属性,轴属性相关的函数都支持fontsize 参数来设置字号
# 这里我们都设置为 14
plt.xlabel("值", fontsize = 14)
plt.ylabel("频率", fontsize = 14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title("正态分布的直方图", fontsize=14)
# 设置画布基本属性:1.显示中文 2.显示负号
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
# 画直方图,分50组,设置长方形的边框颜色是黑色
plt.hist(hints, bins=50, color=[0,0,1], edgecolor = [0,0,0])
plt.show()
运行后如下
展示多个直方图
为了模拟多个直方图,我们首先生成另外两个数据源
#coding: utf-8
#date = 2022/9/11
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
hints = np.random.normal(5, 10, 1000)
hints_1 = np.random.normal(0, 8, 500)
hints_2 = np.random.normal(15, 10, 800)
#接下来我们三次调用 plt.hist 即可,为了区分,我们使用三种不同的颜色来画
# 创建画布
figure1 = plt.figure(figsize = (10, 5))
figure1.add_subplot(1,1,1)
# 设置轴的属性,轴属性相关的函数都支持fontsize 参数来设置字号
# 这里我们都设置为 14
plt.xlabel("值",fontsize = 14)
plt.ylabel("频率", fontsize = 14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title("正态分布的直方图", fontsize=14)
# 设置画布基本属性:1.显示中文 2.显示负号
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
# 第一个用蓝色,使用 plt.hist 函数的 alpha 属性,来让三个图都有一定的透明度
plt.hist(hints, bins=50, color=[0,0,1], edgecolor=[0,0,0], alpha = 0.5)
# 第二个用绿色
plt.hist(hints_1, bins=50, color=[0,1,0], edgecolor=[0,0,0], alpha = 0.5)
# 第三个用红色
plt.hist(hints_2, bins=50, color=[1,0,0], edgecolor=[0,0,0], alpha = 0.5)
plt.show()
运行如下:
条形图
条形图,又称为柱状图,有的地方也把横版的称为条形图,竖版的称为柱状图,这里我们统称条形图
#coding: utf-8
#date = 2022/9/11
import matplotlib.pyplot as plt
import numpy as np
math_scores = np.array([71,65,70,96,64])
chinese_scores = np.array([84,75,68,83,57])
english_scores = np.array([55,78,76,91,64])
# 创建画布
figure2 = plt.figure(figsize = (10, 5))
figure2.add_subplot(1,1,1)
# 设置轴的属性
plt.xlabel("", fontsize = 14)
plt.ylabel("平均分", fontsize = 14)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title("期中成绩条形图", fontsize=14)
# 设置画布基本属性:1.显示中文 2.显示负号
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
category = ["一班", "二班", "三班", "四班", "五班"]
# 使用 index 数组来代替类别
index_category = np.arange(len(category))
# 指定每条条形的宽度
bar_width = 0.25
# 指定宽度为 bar_width, 并且绘制在 index - bar_width 的区域,也就是每组图的左边
plt.bar(index_category - bar_width, chinese_scores, width=bar_width, color=[0,0,1])
# 指定宽度为 bar_width, 并且绘制在 index 的区域,也就是每组图的中间
plt.bar(index_category, math_scores, width=bar_width, color=[0,1,0])
# 指定宽度为 bar_width, 并且绘制在 index + bar_width 的区域,也就是每组图的右边
plt.bar(index_category + bar_width, english_scores, width=bar_width, color=[1,0,0])
plt.show()
运行如下
饼图
plt.pie 函数可以绘制饼图
pie 函数由以下几个关键参数实现功能
- x:饼图每一块的占比列表,列表有几个元素就代表饼图分几块
- explode:凸出显示,也是一个列表,和 x 一一对应,代表具体某一块是否要凸出显示
- colors:列表,和 x 一一对应,代表每一块的颜色
- labels:标签文本列表,和 x 一一对应,代表每一块的标题
- autopct:代表百分比文本的格式
- startangle: 默认饼图是从角度为 0 的位置逆时针开始画,这里可以指定初始角度
- labeldistance:文本标签距离饼图的距离
- pctdistance:百分比标签距离饼图中心的距离
假设我们对一个年级的学生,统计历史上得过三好学生称号的情况,完全没得过的占比为 40%, 得过一次的占比为 30%, 二次的为 25%, 三次以上的为 5%。现在我们用饼图表示这个数据,并将得过三次以上的凸出显示
import matplotlib.pyplot as plt
# 创建画布
figure5 = plt.figure(figsize = (10, 5))
figure5.add_subplot(1,1,1)
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
# 设置饼图数据源
category = ["没有得过", "得过一次", "得过二次", "得过三次以上"]
size = [40, 30, 25, 5]
# 用四种不同的颜色绘制不同的部分
color = ["r", "g", "b", "c"]
explode = [0,0,0,0.1]
# 绘制饼图
plt.pie(size,explode=explode,colors=color,labels=category,labeldistance= 1.1, autopct="%1.1f%%", startangle=90,pctdistance=0.6)
plt.show()
运行如下: