matplotlib常用图形绘制


一、散点图绘制

需求:探究房屋面积和房屋价格的关系 房屋面积数据: x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,21.61, 483.21, 245.25, 399.25, 343.35] 房屋价格数据: y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,30.74, 400.02, 205.35, 330.64, 283.45]

代码:

import matplotlib.pyplot as plt
# 0.准备数据 
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64, 163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51, 21.61, 483.21, 245.25, 399.25, 343.35] 
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34, 140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 , 30.74, 400.02, 205.35, 330.64, 283.45] 
# 1.创建画布 
plt.figure(figsize=(20, 8), dpi=100) 
# 2.绘制散点图 
plt.scatter(x, y) 
# 3.存储图像
plt.savefig("./test.png")
# 4.显示图像
plt.show()

二、柱状图绘制

需求-对比每部电影的票房收入 准备数据: ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它'] [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222] 

 代码:

from pylab import mpl

#设置显示中文字体
mpl.rcParams["font.sans-serif"]=["SimHei"]
#设置正常显示符号
mpl.rcParams["axes.unicode_minus"]=False

# 0.准备数据 
# 电影名字 
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它'] 
# 横坐标 
x = range(len(movie_name)) 
# 票房数据 
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222] 
# 1.创建画布 
plt.figure(figsize=(20, 8), dpi=100) 
# 2.绘制柱状图 
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','b'])
# 2.1b修改x轴的刻度显示 
plt.xticks(x, movie_name) 
# 2.2 添加网格显示 
plt.grid(linestyle="--", alpha=0.5) 
# 2.3 添加标题 
plt.title("电影票房收入对比") 
# 3.存储图像
plt.savefig("./test.png")
# 4.显示图像
plt.show()

三、常用图形种类、意义及api

1、折线图:以折线的上升或下降来表示统计数量的增减变化的统计图

特点:能够显示数据的变化趋势,反映事物的变化情况。(变化) api:plt.plot(x, y) 

2、散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律) api:plt.scatter(x, y) 

3、柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。

特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比) api:plt.bar(x, width, align='center', **kwargs) 
Parameters:
x : 需要传递的数据
width : 柱状图的宽度
align : 每个柱状图的位置对齐方式
{‘center’, ‘edge’}, optional, default: ‘center’
**kwargs :
color:选择柱状图的颜色 

4、直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。

特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计) api:matplotlib.pyplot.hist(x, bins=None) 
Parameters:
x : 需要传递的数据
bins : 组距
当为单个数字时这个参数指定bin(箱子)的个数,也就是总共有几条条状图

示例一:

代码:

import matplotlib.pyplot as plt
import numpy as np

x=np.random.randint(0,100,100)#生成【0-100】之间的100个数据,即 数据集
bins=np.arange(0,101,10)#设置连续的边界值,即直方图的分布区间[0,10],[10,20]...
#直方图会进行统计各个区间的数值
plt.hist(x,bins,color='fuchsia',alpha=0.5)#alpha设置透明度,0为完全透明

plt.xlabel('scores')
plt.ylabel('count')
plt.xlim(0,100)#设置x轴分布范围

plt.show()

注意bins的范围设置,如果使用np.arange(0,100,10),则不会统计[90-100]区间的频数,结果如下

官方教程中还涉及对直方图进行曲线拟合,本例由于不符合正态分布,这里将每个柱状图的中心点进行连接,hist()第一个返回值是统计各个区间的频数,第二个返回值是bins,即区间,所以我们有了点坐标,使用plot函数即可,实现过程如下:
import matplotlib.pyplot as plt
import numpy as np

x=np.random.randint(0,100,100)#生成【0-100】之间的100个数据,即 数据集
bins=np.arange(0,101,10)#设置连续的边界值,即直方图的分布区间[0,10],[10,20]...
width=10#柱状图的宽度
#直方图会进行统计各个区间的数值
frequency_each,_,_= plt.hist(x,bins,color='deepskyblue',width=width,alpha=0.7)#alpha设置透明度,0为完全透明
plt.xlabel('scores')
plt.ylabel('count')
plt.xlim(0,100)#设置x轴分布范围
plt.plot(bins[1:]-(width//2),frequency_each,color='palevioletred')#利用返回值来绘制区间中点连线
plt.show()

实例二:正态分布

代码:

import matplotlib.pyplot as plt
# 生成均匀分布的随机数 
x1 = np.random.normal(1.75, 1, 100000000)
# 画图看分布状况 
# 1)创建画布 
plt.figure(figsize=(20, 10), dpi=100) 
# 2)绘制直方图 
plt.hist(x1, 1000) 
# 3)显示图像 
plt.show()

5、饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。

特点:分类数据的占比情况(占比) api:plt.pie(x, labels=,autopct=,colors) 
Parameters:
x:数量,自动算百分比
labels:每部分名称
autopct:占比显示指定%1.2f%%
colors:每部分颜色