目录
一、绘制直方图
1、简单直方图
2、绘制横向直方图
3、绘制堆叠直方图
4、对比直方图
二、折线图与散点图
三、绘制饼图
四、雷达图
1、简单雷达图
2、多层雷达图
五、总和
在前面的学习中,我们能够使用一些库进行数据的整合,收集,整理等,而在进行了这些操作之后,我们需要把这些整合好的数据进行更加直观的展示,比如用一些统计图来实现,而matplotlib就可以完成这个工作。
matplotlib是一个第三方库,需要使用pip命令去下载
一、绘制直方图
1、简单直方图
我们可以用matplotlib库来绘制一个基本的直方图:
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #包含了绘图时的可配置参数
rcParams['font.family'] = rcParams['font.sans-serif'] = 'SimHei' #设置中文支持,是中文的黑体
ax = plt.figure().add_subplot() #plt.figure()创建一个可视窗口,add_subplot() 是在窗口里面创建一个可绘画的子图(可以在一个窗口里面绘制多个子图)
ax.bar(x = (0.2 , 0.6 , 0.8 , 1.2) , height = (3 , 5 , 7 , 3.5) , width = 0.1) #ax.bar()是在子图上绘图,里面的三个参数分别是指:①每个柱子的中心位置②每个柱子的高度③每个柱子的宽度(也可以设置成不同的五个数值)
ax.set_title("我的第一个直方图!") #为这个子图设置标题
plt.show() #展示出来
输出:
(注:在绘制柱状图时,程序会根据数据的大小,来控制子图的大小,默认就是宽度比两边的柱子各往左和右一点,高度比最高的柱子高一点)
2、绘制横向直方图
想要绘制横向的直方图,我们只需要把上面的代码稍加改动:
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #包含了绘图时的可配置参数
rcParams['font.family'] = rcParams['font.sans-serif'] = 'SimHei'
ax = plt.figure().add_subplot()
ax.barh(y = (0.2 , 0.6 , 0.8 , 1.2) , width = (3 , 5 , 7 , 3.5) , height = 0.1)
#↑ 在这里bar变成了barh,x也变成了y,再把宽和高交换一下
ax.set_title("我的第一个直方图!")
plt.show()
效果:
3、绘制堆叠直方图
有时我们需要在一个柱子上显示多个数据,然后看看总和以及各个数据之间的占比,这时就需要堆叠直方图:
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #包含了绘图时的可配置参数
rcParams['font.family'] = rcParams['font.sans-serif'] = 'SimHei'
ax = plt.figure().add_subplot()
labels = ['A' , 'B' , 'C' , 'D'] #创建了x轴上每一个柱子的标签
num1 = [5 , 10 , 7 , 12]
num2 = [6 , 5 , 12 , 10] #两组中各个柱子的高度
cordx = range(len(num1)) #创建范围对象,给每个柱子创建一个位置,位置的个数就和num1中的个数一样
rects1 = ax.bar(x = cordx , height = num1 , width = 0.5 , color = "red" , label = "Dept1")
#在子图上绘制第一组数据的各个柱状图,里面的参数分别是:①每个柱子的x轴位置 ②柱子高度 ③柱子宽度 ④柱子颜色 ⑤标签
rects2 = ax.bar(x = cordx , height = num2 , width = 0.5 , color = "green" , label = "Dept2" , bottom = num1)
#和上面一样,多了一个bottom,是设置第二组柱子的底部的起始位置,我们设置在了num1的上方,实现了堆叠效果
#上面的参数中“label”标签是应用在了一会图片的右上角
ax.set_ylim(0 , 50) #设置y轴范围
ax.set_ylabel("Profit") #设置y轴的标签
ax.set_xticks(cordx) #设置x轴的刻度
ax.set_xticklabels(labels) #设置各个刻度的标签
ax.set_xlabel("In year 2025") #设置x轴的标签
ax.set_title("My Data") #设置子图的标题
ax.legend() #显示图例,就是rects1和2里面的label(一会看图片的右上角)
plt.show() #展示
效果:
4、对比直方图
当我们在一个类中有多组数据时,并且需要比较直观的比较,就需要对比直方图:
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #包含了绘图时的可配置参数
rcParams['font.family'] = rcParams['font.sans-serif'] = 'SimHei'
ax = plt.figure(figsize=(10,5)).add_subplot() #创建新的窗口和子图,这里给窗口设置了大小
ax.set_ylim(0,120)
ax.set_xlim(0,60) #设置了x和y轴的范围
x1 = [5 , 15 , 25 , 35 , 45]
x2 = [8 , 18 , 28 , 38 , 48]
x3 = [11 , 21 , 31 , 41 , 51]
#以上三组是每一个每一个柱子中心点的横坐标
#如果出现了各个柱子之间重叠的情况,可以调整这三个组之间的间距
#下面设置柱子宽度的时候,如果宽度和x之间的距离相同,每一个组之间的柱子就没有缝隙
y1 = [25 , 29 , 66 , 24 , 67]
y2 = [66 , 25 , 87 , 57 , 28]
y3 = [12 , 56 , 90 , 68 , 35]
#以上三组是每一个柱子的数据
rects1 = ax.bar(x1 , y1 , facecolor = "red" , width = 3 , label = 'A')
rects2 = ax.bar(x2 , y2 , facecolor = "green" , width = 3 , label = 'B')
rects3 = ax.bar(x3 , y3 , facecolor = "blue" , width = 3 , label = 'C')
#以上三组进行了绘图,参数分别是指:柱子的中心坐标,柱子高度,柱子颜色,柱子宽度,以及柱子的图例名称
ax.set_xticks(x2) #让x2,也就是每一组中中间的那个柱子和x轴坐标对其
ax.set_xticklabels(('A1' , 'A2' , 'A3' , 'A4' , 'A5')) #每一组的标签
ax.legend() #显示图例
def label(ax , rects): #给每一个柱子上添加数字
for rect in rects : #遍历每一个柱子
height = rect.get_height() #获取柱子的高度
ax.text(rect.get_x() - 0.05 + rect.get_width()/2.0 , height + 5 , str(height) , rotation = 90)
#ax.text()在子图中添加文本,第一个参数是计算每一个文本的x轴位置,在起始位置+每一个柱子宽度的1/2再-0.05,即在每一个柱子的中心偏左
#下一个就是文本的y轴位置,即在每一个柱子的高度上加5
#第三个就是输入的内容,即每一个柱子的高度的具体字符
#最后一个就是把文字旋转90度
label(ax , rects1)
label(ax , rects2)
label(ax , rects3)
#调用三次label函数,进行赋值
plt.show()
效果:
二、折线图与散点图
当我们有大量数据或者想要观察趋势的时候,我们就可以绘制一个散点图或者折线图:
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #包含了绘图时的可配置参数
import math , random
def drawPlotPro(ax) :
xs = [i / 100 for i in range(1500)] #生成一个列表,里面包含1500个数据点,且每一个数据点是i/100
ys = [10 * math.sin(x) for x in xs] #对于列表xs中的每一个数据,我们进行10 * math.sin(x),来生成一个正弦波
#上面这两个分别就是每一个点的x和y坐标
ax.plot(xs , ys , "red" , label = "A") #使用ax.plot绘制折线图,前两个是每一个点的xy坐标,第二个是颜色,然后是图例标签
ys = list(range(-18 , 18)) #生成一个列表,里面是从-18到17的序列
random.shuffle(ys) #打乱他
ax.scatter(range(16) , ys[:16] , c = "blue") #ax.scatter()绘制散点图,参数第一个是x轴坐标,第二个是y轴坐标,第三个是颜色
ax.plot(range(16) , ys[:16] , "blue" , label = "B") #ax.plot()绘制折线图
ax.legend() #显示图例
ax.set_xticks(range(16)) #x轴坐标是0,1,2...15的地方加刻度
ax.set_xticklabels(range(16)) #刻度的标签
ax = plt.figure(figsize=(10,4) , dpi=100).add_subplot() #视窗的大小,以及分辨率(清晰度)
drawPlotPro(ax) #调用ax
plt.show()
效果:
三、绘制饼图
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #包含了绘图时的可配置参数
def DrawPiePro(ax) :
lbs = ('A' , 'B' , 'C' , 'D') #饼图各个块的标签
sectors = [25 , 20 , 50 , 5] #每一块的占比
expl = [0 , 0.1 , 0 , 0] #每一块的凸显程度
ax.pie(x = sectors , labels = lbs , explode = expl , autopct = '%.2f' , shadow = True , labeldistance = 1.1 , pctdistance = 0.6 , startangle = 90)
#ax.pie()绘制饼图,参数分别是:每一块的占比,凸显程度,显示百分比,保留两位小数,增加阴影效果,标签和饼图的距离(大于1就是向外),百分比标签和饼图的距离,以及绘制的起点位置,90就是正上方
ax.set_title("pie sample") #饼图标题
ax = plt.figure().add_subplot() #创建窗口和子图
DrawPiePro(ax)
plt.show()
效果:
四、雷达图
1、简单雷达图
import matplotlib.pyplot as plt #主要进行绘图的模块
from matplotlib import rcParams #处理汉字用
def DrawRadar(ax) :
pi = 3.1415926
labels = ["语文" , "数学" , "英语" , "物理" , "化学" , "地理"] #六个属性的名称
attrNum = len(labels) #属性的种类,也就是属性的个数,此处是6
data = [120 , 110 , 110 , 70 , 88 , 90] #各个属性的数值
angles = [2 * pi * i / attrNum for i in range(attrNum)] #以弧度为单位的六个属性对应的六个半径的角度
angles2 = [x * 180 / pi for x in angles] #这个是角度
ax.set_ylim(0 , 150) #半径的范围
ax.set_thetagrids(angles2 , labels , fontproperties = "SimHei") #绘制这六个半径,用角度制,以及各个属性的名称,和字体
ax.fill(angles , data , facecolor = 'g' , alpha = 0.25) #把围起来的区域填充,用data数据,颜色是绿色,并设置了透明度
rcParams['font.family'] = rcParams['font.sans-serif'] = 'SimHei' #处理汉字
ax = plt.figure().add_subplot(projection = "polar") #生成视窗和极坐标的子图
DrawRadar(ax)
plt.show()
效果:
2、多层雷达图
import matplotlib.pyplot as plt # 主要进行绘图的模块
from matplotlib import rcParams # 处理汉字用
rcParams['font.family'] = rcParams['font.sans-serif'] = 'SimHei' # 处理汉字
pi = 3.1415926
names = ['张三', '李四', '王五']
labels = ["语文", "数学", "英语", "物理", "化学", "地理"] # 六个属性的名称
attrNum = len(labels) # 属性的种类,也就是属性的个数,此处是6
data = [[120, 125, 100], [130, 140, 130], [110, 100, 120], [70, 80, 90], [67, 79, 87],[90, 100, 97]] # 各个属性的数值,第一个就是三个人各自的语文成绩
angles = [2 * pi * i / attrNum for i in range(attrNum)] # 以弧度为单位的六个属性对应的六个半径的角度
angles2 = [x * 180 / pi for x in angles] # 这个是角度
ax = plt.figure().add_subplot(projection="polar") # 生成视窗和极坐标的子图
ax.fill(angles, data, alpha=0.25) # 把围起来的区域填充,用data数据,并设置了透明度
ax.set_ylim(0, 150) # 半径的范围
ax.set_thetagrids(angles2, labels) # 绘制这六个半径,用角度制,以及各个属性的名称
ax.legend(names, loc=(0.95, 0.9)) #添加图例,以及位置
plt.show()
效果:
五、总和
在我们能绘制如此之多的图形后,我们可能需要在一个面板上就看到所有的数据们也就是把这些数据放在一个窗口上:
fig = plt.figure(figsize = (8,8)) #创建视窗
ax = fig.add_subplot(2,2,1) #添加子图1,即饼图,2,2,1的意思是划分处一个2x2的子图,并放在第一处(就是左上角)
DrawPiePro(ax)
ax = fig.add_subplot(2,2,2 , projection = "polar") #添加子图2
DrawRadar(ax)
ax = plt.subplot2grid((2,2) , (1,0) , colspan=2) #第二个参数1,0是指第一行,第零列,就是左下角的位置,第三个参数就是这个子图跨越两列
drawPlotPro(ax)
plt.figtext(0.05 , 0.05 , 'subplot sample') #在图形窗口添加文本
plt.show()
当然这个要结合上面的各个我们自己创建的函数,我们把他们结合起来:
import matplotlib.pyplot as plt # 主要进行绘图的模块
from matplotlib import rcParams # 处理汉字用
import math, random
def drawPlotPro(ax):
xs = [i / 100 for i in range(1500)] # 生成一个列表,里面包含1500个数据点,且每一个数据点是i/100
ys = [10 * math.sin(x) for x in xs] # 对于列表xs中的每一个数据,我们进行10 * math.sin(x),来生成一个正弦波
# 上面这两个分别就是每一个点的x和y坐标
ax.plot(xs, ys, "red", label="A") # 使用ax.plot绘制折线图,前两个是每一个点的xy坐标,第二个是颜色,然后是图例标签
ys = list(range(-18, 18)) # 生成一个列表,里面是从-18到17的序列
random.shuffle(ys) # 打乱他
ax.scatter(range(16), ys[:16], c="blue") # ax.scatter()绘制散点图,参数第一个是x轴坐标,第二个是y轴坐标,第三个是颜色
ax.plot(range(16), ys[:16], "blue", label="B") # ax.plot()绘制折线图
ax.legend() # 显示图例
ax.set_xticks(range(16)) # x轴坐标是0,1,2...15的地方加刻度
ax.set_xticklabels(range(16)) # 刻度的标签
#-------------------------------------------------------------------------------
def DrawPiePro(ax) :
lbs = ('A' , 'B' , 'C' , 'D') #饼图各个块的标签
sectors = [25 , 20 , 50 , 5] #每一块的占比
expl = [0 , 0.1 , 0 , 0] #每一块的凸显程度
ax.pie(x = sectors , labels = lbs , explode = expl , autopct = '%.2f' , shadow = True , labeldistance = 1.1 , pctdistance = 0.6 , startangle = 90)
#ax.pie()绘制饼图,参数分别是:每一块的占比,凸显程度,显示百分比,保留两位小数,增加阴影效果,标签和饼图的距离(大于1就是向外),百分比标签和饼图的距离,以及绘制的起点位置,90就是正上方
ax.set_title("pie sample") #饼图标题
#-------------------------------------------------------------------------------
def DrawRadar(ax) :
pi = 3.1415926
labels = ["语文" , "数学" , "英语" , "物理" , "化学" , "地理"] #六个属性的名称
attrNum = len(labels) #属性的种类,也就是属性的个数,此处是6
data = [120 , 110 , 110 , 70 , 88 , 90] #各个属性的数值
angles = [2 * pi * i / attrNum for i in range(attrNum)] #以弧度为单位的六个属性对应的六个半径的角度
angles2 = [x * 180 / pi for x in angles] #这个是角度
ax.set_ylim(0 , 150) #半径的范围
ax.set_thetagrids(angles2 , labels , fontproperties = "SimHei") #绘制这六个半径,用角度制,以及各个属性的名称,和字体
ax.fill(angles , data , facecolor = 'g' , alpha = 0.25) #把围起来的区域填充,用data数据,颜色是绿色,并设置了透明度
#-------------------------------------------------------------------------------
fig = plt.figure(figsize = (8,8)) #创建视窗
ax = fig.add_subplot(2,2,1) #添加子图1,即饼图,2,2,1的意思是划分处一个2x2的子图,并放在第一处(就是左上角)
DrawPiePro(ax)
ax = fig.add_subplot(2,2,2 , projection = "polar") #添加子图2
DrawRadar(ax)
ax = plt.subplot2grid((2,2) , (1,0) , colspan=2) #第二个参数1,0是指第一行,第零列,就是左下角的位置,第三个参数就是这个子图跨越两列
drawPlotPro(ax)
plt.figtext(0.05 , 0.05 , 'subplot sample') #在图形窗口添加文本
plt.show()
效果:
以上就是matplotlib数据展示的全部内容:)