Matplotlib基础
什么是Matplotlib:
1、 是专门用于开发2D图表(包括3D图表) 2、以渐进、交互式方式实现数据可视化
Matplotlib特点:
能将数据进行可视化,更直观的呈现 使数据更加客观、更具说服力
实现一个简单的Matplotlib画图 — 以折线图为例
matplotlib.pyplot模块
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
plt.figure(figsize=(20, 8), dpi=100)
plt.plot([1, 2, 3, 4, 5, 6 ,7], [38,30,34,28,39,35,37])
plt.show()
基本绘图功能
以郑州市温度为例绘制温度变化折线图
基本绘图
import matplotlib.pyplot as plt
import random
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_zhengzhou)
plt.show()
添加自定义x,y刻度
plt.xticks(x, **kwargs)
x:要显示的刻度值
plt.yticks(y, **kwargs)
y:要显示的刻度值
import matplotlib.pyplot as plt
import random
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_zhengzhou)
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(20,40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::2])
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
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_zhengzhou)
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(20,40)
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
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_zhengzhou)
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(20,40)
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
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_zhengzhou)
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(20,40)
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()
一个坐标系中绘制多个图像
多次plot
例如在郑州天气的基础上再添加一个北京天气 代码实现:
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
x = range(60)
y_zhengzhou = [random.uniform(28, 42) for i in x]
y_beijing= [random.uniform(15, 34) for i in x]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y_zhengzhou,color='b',label='郑州',linestyle='-.')
plt.plot(x,y_beijing,color='r',label='北京',linestyle='-')
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(50)
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 |
多个坐标系显示— plt.subplots(面向对象的画图方法)
可以通过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:每部分颜色
|