什么是Matplotlib:
1、 是专门用于开发2D图表(包括3D图表)
2、以渐进、交互式方式实现数据可视化
Matplotlib特点:
能将数据进行可视化,更直观的呈现
使数据更加客观、更具说服力
matplotlib.pytplot包含了一系列类似于matlab的画图函数。
import matplotlib.pyplot as plt
1、创建画布 – plt.figure()
plt.figure(figsize=(), dpi=)
figsize:指定图的长宽
dpi:图像的清晰度
返回fig对象
2、绘制图像 – plt.plot(x, y)
3.显示图像 – plt.show()
举例:展现郑州一周的天气,比如从星期一到星期日的天气温度如下:
import matplotlib.pyplot as plt
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制折线图
plt.plot([1, 2, 3, 4, 5, 6 ,7], [38,30,34,28,39,35,37])
# 3.显示图像
plt.show()
以郑州市温度为例绘制温度变化折线图
import matplotlib.pyplot as plt
import random
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_zhengzhou)
# 3.显示图像
plt.show()
plt.xticks(x, **kwargs)
x:要显示的刻度值
plt.yticks(y, **kwargs)
y:要显示的刻度值
import matplotlib.pyplot as plt
import random
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_zhengzhou)
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])
# 3.显示图像
plt.show()
此时我们遇到了中文乱码情况,导入一下两行代码就可以解决乱码:
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
为了更加清楚地观察图形对应的值,我们可以添加网格:
plt.grid(True, linestyle=’–’, alpha=0.5)
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_zhengzhou)
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])
# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()
添加x轴、y轴描述信息及标题,通过fontsize参数可以修改图像中字体的大小
plt.xlabel(“时间”)
plt.ylabel(“温度”)
plt.title(“中午11点0分到12点之间的温度变化图示”, fontsize=20)
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_zhengzhou)
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])
# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)
#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
plt.show()
#保存图片到指定路径
plt.savefig(“zhengzhoutianqi.png”)
注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_zhengzhou)
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(20,40)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])
# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)
#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
# 图像保存
plt.savefig("zhengzhoutianqi.png")
plt.show()
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 画出温度变化图
# 0.准备x, y坐标的数据
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
y_beijing= [random.uniform(15, 34) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 2.绘制折线图
plt.plot(x, y_zhengzhou,color='b',label='郑州',linestyle='-.')
plt.plot(x,y_beijing,color='r',label='北京',linestyle='-')
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(50)
# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])
# 添加图例
plt.legend(loc=0)
# 添加网格
plt.grid(True, linestyle='--', alpha=0.5)
#添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
# 图像保存
plt.savefig("zhengzhoutianqi.png")
plt.show()
上个代码中,存在:
plt.plot(x, y_zhengzhou,color=‘b’,label=‘郑州’,linestyle=’-.’)
plt.plot(x,y_beijing,color=‘r’,label=‘北京’,linestyle=’-’)
其中出现了折线效果和图例,其中的设计参数如下:
颜色字符 | 风格字符 |
---|---|
r 红色 | - 实线 |
g 绿色 | - - 虚线 |
b 蓝色 | -. 点划线 |
w 白色 | : 点虚线 |
c 青色 | ’ ’ 留空、空格 |
m 洋红 | |
y 黄色 | |
k 黑色 |
loc的参数是图例位置
Location String | Location Code |
---|---|
‘best’ | 0 |
‘upper right’ | 1 |
‘upper left’ | 2 |
‘lower left’ | 3 |
‘lower right’ | 4 |
‘right’ | 5 |
‘center left’ | 6 |
‘center right’ | 7 |
‘lower center’ | 8 |
‘upper center’ | 9 |
‘center’ | 10 |
可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数,创建一个带有多个axes(坐标系/绘图区)的图
matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw)
返回对象:
fig : 图对象
axes : 返回相应数量的坐标系
plt.函数名()相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法。
代码实现(郑州与北京市天气为例):
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False # 设置正常显示符号
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=100)
x=range(60)
y1=[random.uniform(2,25) for i in x]
y2=[random.uniform(25,35) for i in x]
axes[0].plot(x,y1,label='北京',color='g',linestyle='-')
axes[1].plot(x,y1,label='郑州',color='r',linestyle='--')
y_ticks=range(40)
x_ticks=['11时{}分'.format(i) for i in x]
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks[::5])
axes[0].grid(True,linestyle='-',alpha=0.8)
axes[1].grid(True,linestyle='-',alpha=0.8)
axes[0].set_xlabel('时间')
axes[0].set_ylabel('温度')
axes[0].set_title("中午11点--12点某城市温度变化图", fontsize=20)
axes[1].set_xlabel('时间')
axes[1].set_ylabel('温度')
axes[1].set_title("中午11点--12点某城市温度变化图", fontsize=20)
axes[0].legend(loc=0)
axes[1].legend(loc=0)
plt.show()
定义:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
plt.scatter(x, y)
import matplotlib.pyplot as plt
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]
plt.figure(figsize=(20,8),dpi=100)
plt.scatter(x,y)
plt.show()
plt.bar(def bar(x, height, width=0.8,bottom=None,*,align='center',data=None,**kwargs))
案例:统计电影票房
```python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20,8),dpi=200)
movie_name=['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
x=range(len(movie_name))
y=[73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
plt.bar(x,y,width=0.5,color=['b','r','g','y','c','m','y','k','c','g','b'])
plt.xticks(x,movie_name)
plt.xlabel('电影名称',fontsize=20)
plt.grid(True,linestyle='-',alpha=0.5)
plt.show()
plt.bar
用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
plt.pie(x, labels=,autopct=,colors)
Parameters:
x:数量,自动算百分比
labels:每部分名称
autopct:占比显示指定%1.2f%%
colors:每部分颜色