一、Matplotlib初识
1.什么是matplotlib ---画2维图形的python库
专用于开发2D图表
2.数据可视化---帮助理解数据
js库--D3 echarts
3.实现一个简单的画图
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure() #创建画布
plt.plot([1,0,9],[4,5,6]) #[]第一个是横坐标,[]第二个是纵坐标
plt.show
4.matplotlib 三层结构
(1)容器层
画板层(Canvas)底层
画布层(Figure) 中层
绘图区、坐标系 外层
x、y轴长成的结构
(2)辅助显示层 ---》在绘图区上
(3)图像层 ---》在绘图区上
二、折线图与基础绘图功能
1.折线图绘制与保存图片
(1)matplotlib.pyplot 包含了一系列类似于matlab的画图函数。作用于当前图形的当前坐标系。
(2)折线图绘制实例
展示上海一周天气
(3)设置画布属性与图片保存
plt.figure(figsize=(,) , dpi=)
figsize:画布大小
dpi: dot per inch图像清晰度
plt.savefig(path):保存图片
注意:保存图像应该在显示图像之前 ,否则保存的图像为空
2.完善原始折线图
A.完善原始折线图--辅助显示层
#展示上海天气
#1.创建画布
plt.figure(figsize=(20,8),dpi=180)
#2.绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
#保存图像 保存图像应该在显示之前
plt.save('E:')
#3.显示图像
plt.show()
- 添加自定义x,y轴:
plt.xticks(x,**kwargs)
plt.yticks(y,**kwargs)
- 中文字体显示:
(1)安装字体
双击安装
(2)删除matplotlib缓存文件
(3)修改配置文件
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文
- 添加网格:
plt.grid(True,linestyle='--',alpha=0.5) #三个参数分别表示要显示网格、线条分隔,透明度
- 添加坐标轴和标题、网格线:
#画某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15-18度
import random
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#1.准备数据
x=range(60)
y_shanghai=[random.uniform(15,18) for i in x]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像
plt.plot(x,y_shanghai)
#修改x、y刻度
#准备x的刻度说明
x_label=["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_label) #不用具体制定x轴的下界和上界,步长为5
plt.yticks(range(0,40,5))
#添加网格线
plt.grid(True,linestyle='--',alpha=0.5)
#添加描述信息
plt.xlabel('时间')
plt.ylabel('温度')
plt.title('上海一周温度')
#4.显示图像
plt.show()
B.完善原始折线图--图像层
需求:再添加一个城市温度变化
样式修改在plt.plot();并添加了图例
#再添加一个城市温度变化
#收集北京的温度变化从1-3度
#准备北京的数据
import random
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#1.准备数据
x=range(60)
y_shanghai=[random.uniform(15,18) for i in x]
y_beijing=[random.uniform(1,3) for i in x]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像 --- 颜色样式在此修改
plt.plot(x,y_shanghai,color='r',linestyle='-.',label='上海')
plt.plot(x,y_beijing,color='b',label='北京')
#显示图例
plt.legend(loc="upper right")
#修改x、y刻度
#准备x的刻度说明
x_label=["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_label) #不用具体制定x轴的下界和上界,步长为5
plt.yticks(range(0,40,5))
#添加网格线
plt.grid(True,linestyle='--',alpha=0.5)
#添加描述信息
plt.xlabel('时间')
plt.ylabel('温度')
plt.title('上海|北京一周温度')
#4.显示图像
plt.show()
3. 多个坐标系显示--plt.subplots()
figure,axes=matplotlib.pyplot.subplots(nrows=1,ncols=2,**fig_kw) #返回1行2列的图
返回图像和画图区
axws[0].方法名 #调用第一个图对象
axws[1].方法名 #调用第二个图对象,此时为面向对象,函数大多变为了set_函数名()
#再添加一个城市温度变化
#收集北京的温度变化从1-3度
import random
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#1.准备数据
x=range(60)
y_shanghai=[random.uniform(15,18) for i in x]
y_beijing=[random.uniform(1,3) for i in x]
#2.创建画布
#plt.figure(figsize=(20,8),dpi=80)
figure,axes=plt.subplots(nrows=1,ncols=2,figsize=(20,8),dpi=80)
#3.绘制图像 --- 颜色样式在此修改
axes[0].plot(x,y_shanghai,color='r',linestyle='-.',label='上海')
axes[1].plot(x,y_beijing,color='b',label='北京')
#显示图例
axes[0].legend(loc="upper right")
axes[1].legend(loc="upper right")
#修改x、y刻度
#准备x的刻度说明
x_label=["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::8])
axes[0].set_xticklabels(x_label[::5]) #不用具体制定x轴的下界和上界,步长为5
axes[0].set_yticks(range(0,40,5))
axes[1].set_xticks(x[::8])
axes[1].set_xticklabels(x_label[::5]) #不用具体制定x轴的下界和上界,步长为5
axes[1].set_yticks(range(0,40,5))
#添加网格线
axes[0].grid(True,linestyle='--',alpha=0.5)
axes[1].grid(True,linestyle='--',alpha=0.5)
#添加描述信息
axes[0].set_xlabel('时间')
axes[0].set_ylabel('温度')
axes[0].set_title('上海一周温度')
axes[1].set_xlabel('时间')
axes[1].set_ylabel('温度')
axes[1].set_title('北京一周温度')
#4.显示图像
plt.show()
plt.show()
4.折线图应用场景
- 某指标随时间的变化情况
#绘制数学函数图像
import numpy as np
import matplotlib.pyplot as plt
#1.准备数据
x=np.linspace(-1,1,1000)
y=2*x*x
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像
plt.plot(x,y)
#添加网格显示
plt.grid(linestyle='--',alpha=0.8)
#4.显示图像
plt.show()
5.常见图形种类
- 折线图:某指标随时间的变化情况
- 散点图:用于画点,观察数据,分析关系/规律
- 柱状图:统计对比
- 直方图:表示数据分布状况
- 饼图:反应占比
6.散点图--探究不同数据的内在关系 plt.scatter(x,y)
需求:探求房屋面积和价格的关系
#需求:探求房屋面积和价格的关系
#1.准备数据
x=[225.98,247.07,253.14,457.86,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]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像
plt.scatter(x,y)
#4.显示图像
plt.show()
7.柱状图--数据对比 plt.bar()
需求:对比相同天数,不同电影票房
#对比相同天数,不同电影票房
#1.准备数据
movie_names=['雷神3','正义联盟','东方快车','全球快报']
first_day=[77853,57767,22354,8725]
first_weekend=[853,5767,2354,11725]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制柱状图
plt.bar(range(4),first_day,width=0.2,label='首日票房') #参数分别为:类比;y值;宽度;标签
plt.bar([i+0.2 for i in range(4)],first_weekend,width=0.2,label='首周票房')
plt.xticks([i+0.1 for i in range(4)],movie_names) #参数为:刻度和参数名
#4.显示图像
plt.show()
8.直方图--表示数据的分布 plt.hist()
- 组数:按不同的范围分组得到的组数
- 组距:每组两个端点差
- 直方图与柱状图的区别:
1)直方图展示数据的分布,柱状图展示数据的大小
2)直方图x轴为定量数据,不可移动位置;状态图为分类数据,可移动位置
3)直方图有间隔,柱状图无间隔
4)直方图柱子宽度可不一样,柱状图柱子宽度一致
hist(x,bins)
x=time
bins 组数=(max(time)-min(time)) // 组数
#电影时长分布
#1.准备数据
time=[i for i in range(1,251)]
print(time)
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像
distance=5
group_num=int((max(time)-min(time))/distance)
plt.hist(time,bins=group_num)
#修改x刻度
plt.xticks(range(min(time),max(time)+5,distance))
#添加网格
plt.grid()
#4.显示图像
plt.show()
注意:(1)组距影响显示效果
(2)y周变量可以是频数或频率,默认为频数,想要变为频率添加一个参数normed=True
8.饼图--表示数据的占比 plt.hist()
plt.pie(x,labels,autopct,colors) #参数分别表示:数量,自指定%动百分比;
#每部分名称; 占比显示指定%1.2f%% ; 每部分颜色 ;%转义字符
#显示不同电影拍片占比
#1.准备数据
movie_names=['雷神3','正义联盟','东方快车','全球快报','将魔装']
place_conut=[60605,54526,20156,32756,9945]
#2.创建画布
plt.figure(figsize=(20,8),dpi=80)
#3.绘制图像
plt.pie(place_conut,labels=movie_names,colors=['b','g','y','r','c'],autopct="%1.2f%%")
plt.legend()
plt.axis('equal') #让图像摆正
#4.显示图像
plt.show()
9.总结
- pandas画图使用的就是matplotlib