第四章:Python科学计算、数据分析、图表可视化库--Matplotlib
04-Python科学计算、数据分析、图表可视化库
1 Matplotlib入门
1.1 课程目标
1.2 matplotlib安装
pip install matplotlib
conda install matplotlib
1.3 Matplotlib基本绘图方式
1.4 绘制第一个图形
importmatplotlib.pyplotasplt
plt.figure(figsize=(8,4))
plt.plot([1,2,3,4,5,6],[123,3,42,5,6,2])
plt.show()
1.5 图表美化-加入图例、标题于标签
importmatplotlib.pyplotasplt
plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号
x1=[1,2,5,8]
y1=[3,7,2,8]
x2=[1,4,7,9]
y2=[4,7,9,11]
plt.plot(x1,y1,label="第一条线")# label关键字设置图例
plt.plot(x2,y2,label="第二条线")
plt.xlabel('x轴')# 设置x轴标签
plt.ylabel('y轴')# 设置y轴标签
plt.title("为图表加入\n图例、标题与标签")# 可以通过转义字符换行
plt.legend()# 显示图例
plt.show()
2 Matplotlib快速进阶
# 导入相关模块,后续不再重复导入
importmatplotlib.pyplotasplt
plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号
2.1 绘制折线图-py.plot()-默认的绘图方式
x=[1,2,3,4,5,6,7,8]
y=[2,4,2,5,6,7,4,9]
plt.plot(x,y,label="折线图")
plt.xlabel("x")
plt.ylabel("y")
plt.title("绘制折线图")
plt.legend()
plt.show()
2.2 绘制柱状图/条形图-plt.bar()/plt.barh()
plt.bar([1,3,5,7,9],[2,5,7,3,7],label="柱状图-01")
plt.bar([2,4,6,8,10],[3,1,8,2,6],label="柱状图-02",color='g')
# color参数支持十六进制的颜色代码,如#191970
plt.legend()
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("绘制柱状图")
plt.show()
ptl.barh()
2.3 绘制直方图 - plt.hist()
populartion_ages=[22,44,55,66,22,31,41,56,31,21,18,23,22,14,20,67,34,26,78,32,23,56,33,53,32,54,88,65,33,55,32,123,98]# 随机输入的年龄
bins=[0,18,36,54,72,90,108,126]# 人为定义的分割区间
plt.hist(populartion_ages,bins,histtype='bar',label='年龄分布图',rwidth=0.8)
# histtype='bar' 直方图类型为bar
# rwidth设置条形图的宽度,默认为1
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("绘制直方图")
plt.legend()
plt.show()
2.4 绘制饼图 - plt.pie()
slices=[7,2,2,13]# 数据
activites=["sleeping","eating","working","playing"]
cols=["c","m","r",'b']
plt.pie(slices,
labels=activites,
colors=cols,
startangle=90,# 指定图形的起始角度
shadow=True,
explode=(0,0.1,0,0),# 指定块突出显示
autopct='%1.1f%%')# 设置显示为百分比
plt.title('饼图')
plt.show()
2.5 绘制散点图 - plt.scatter()
x=[1,2,3,4,5,6,7,8]
y=[2,4,1,5,7,9,3,3]
plt.scatter(x,y,label='skitcat',color='g',s=25,marker='o')
# s:参数表示marker的大小
# marker:表示散点的标记符号,更多的设置可以查看官方文档
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("绘制散点图")
plt.legend()
plt.show()
2.6 绘制堆叠图
days=[1,2,3,4,5]# 代表一周5天
sleeping=[7,8,6,9,8]# 每项活动花费时间记录
eating=[1,2,1,2,1]
working=[9,8,7,8,9]
playing=[7,6,10,5,6]
# 以下代码是为堆叠图设置图例
plt.stackplot(days,sleeping,eating,working,playing,colors=['m','c','r','k'])
plt.plot([],[],color='m',label='sleeping',linewidth=5)
plt.plot([],[],color='c',label='eating',linewidth=5)
plt.plot([],[],color='r',label='working',linewidth=5)
plt.plot([],[],color='k',label='playing',linewidth=5)
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.title("绘制堆叠图(重构)")
plt.legend()
plt.show()
3 Matplotlib综合演练
importmatplotlib.pyplotasplt
importnumpyasnp
# 以下两行代码可作为通用设置
plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号
plt.figure(figsize=(10,6))# 设置画布的大小
# 以下一段代码是将坐标轴移到数据零点的标准写法,这里是数据零点,并不是画布的正中间,若数据本身不是有正有负的数据,则一般不用修改
ax=plt.gca()# 通过plt.gca()获得当前的Axes对象ax
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')# 先把右边和上边的边界设置为不可见
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))# 然后把下边界和左边界移到0点
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
X=np.linspace(-np.pi,np.pi,256,endpoint=True)# 通过np.linspace()方法快速获得数据
(C,S)=np.cos(X),np.sin(X)# 分别或的正弦、余弦函数
plt.plot(X,C,'b-',lw=2.5,label='cos函数')# 'b-':color=blue,linestyle=-;'lw':linewidth
plt.plot(X,S,'r-',lw=2.5,label='sin函数')# Sin函数用红色线表示
plt.title("绘制三角函数\n(cos、sin)")
plt.xlim(X.min()*1.4,X.max()*1.4)# 修改画布边缘留白,通过数据值的最大最小值的倍数修改
plt.ylim(C.min()*1.4,C.max()*1.4)
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$-\pi/2$',r'$-\pi$'])# 改变坐标轴刻度,改为符号pi
plt.yticks([-1,0,1])# 设置y轴坐标刻度
t=2*np.pi/3# 定义变量
# 以下代码是:画出需要标注的蓝色的线,根据两点之间一条直线
plt.plot([t,t],[0,np.cos(t)],color='blue',linewidth=2.5,linestyle='--')
# 以下代码是:画出需要标注的蓝色的点
plt.scatter([t,],[np.cos(t),],50,color='blue')
# 以下代码是:给蓝色的点添加注释
plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t,np.cos(t)),xycoords='data',
xytext=(-90,-50),textcoords='offset points',fontsize=16,
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
# 下同
plt.plot([t,t],[0,np.sin(t)],color='red',linewidth=2.5,linestyle='--')
plt.scatter([t,],[np.sin(t),],50,color='red')
plt.annotate(r'$sin(\frac{2\pi}{3})=-\frac{\sqrt{3}}{2}$',
xy=(t,np.sin(t)),xycoords='data',
xytext=(+10,+30),textcoords='offset points',fontsize=16,
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
# 获得所有的x,y轴的刻度值
forlabelinax.get_xticklabels()+ax.get_yticklabels():
label.set_fontsize(16)
# 设置刻度值所在框框的背景色,及框线色、透明度
label.set_bbox(dict(facecolor='c',edgecolor="None",alpha=0.4))
plt.legend(loc='upper left')
# 可以通过loc=关键字将图例定位,可以通过四个方位关键字进行定位:bottom,upper,left,right
plt.show()
最终效果图
4 Matplotlib高级篇
4.1 高级柱状图/条形图
importmatplotlib.pyplotasplt
importnumpyasnp
plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号
# 取出一张白纸
fig=plt.figure(1)
# 确定绘图范围,由于只需要画一张图,所以我们将整张白纸作为绘图的范围
ax1=plt.subplot(111)# 111代表图纸分为1行1列,然后在第一块画板进行绘图
# 准备数据
data=np.array([15,20,18,25])
x_bar=np.arange(4)
# 核心图形绘制
# rect=ax1.bar(left=x_bar,height=data,width=0.5,color='lightblue')
#The *left* kwarg to `bar` is deprecated use *x* instead. Support for *left* will be removed in Matplotlib 3.0
rect=ax1.bar(x=x_bar,height=data,width=0.5,color='lightblue')
# 向各条形上添加数据标签
forrecinrect:
x=rec.get_x()
height=rec.get_height()
ax1.text(x+0.2,1.02*height,str(height)+'W')
# 绘制x,y坐标轴刻度及标签,标题
ax1.set_xticks(x_bar)
ax1.set_xticklabels(('第一季度','第二季度','第三季度','第四季度'))
ax1.set_ylabel('销量(单位:万件)')
ax1.set_title('2017年季度销量统计')
ax1.grid(True)
ax1.set_ylim(0,28)
plt.show()
4.2 绘制多幅图形
importmatplotlib.pyplotasplt
plt.rcParams["font.sans-serif"]=['SimHei']# 用于正常显示中文标签
plt.rcParams['axes.unicode_minus']=False# 用来正常显示负号
plt.figure(figsize=(6,6),dpi=80)
plt.figure(1)# 创建第一个画板(figure)
plt.subplot(211)# 划分画板为2行1列,并获取第一块区域
plt.plot([1,2,3])
plt.subplot(212)
plt.plot([4,5,6])
plt.figure(2)# 创建第二个画板
plt.plot([4,5,6])# 在当前画板(第二个画板)绘图。默认子图,等价于subplot(111)
plt.title('第二个画板')
plt.figure(1)# 切换到画板1,但此时subplot(212)仍被调用中
plt.subplot(211)# 切换到第一块区域
plt.title('第一块画板(区域1)')
plt.subplot(212)
plt.title('第一块画板(区域2)')
# 调整每个子图之间的距离
plt.tight_layout()# 不传参数可以自动调整
plt.show()
4.3 matplotlib加载csv数据进行可视化
# 定义空列表存放x,y数据
x,y=[],[]
withopen('data/csv/matplotlib-demo.csv')ascsvfile:
lines=csv.reader(csvfile,delimiter=',')
forlineinlines:
x.append(int(line[0]))
y.append(int(line[1]))
print(x)
print(y)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[5, 3, 4, 7, 4, 3, 5, 7, 4, 4]
plt.plot(x,y,label='从数据集读取数据\n图表展示')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.legend()
plt.show()
5 Pandas + Matplotlib简化数据可视化
5.1 在pandas中绘制第一个图形
importpandasaspd
importnumpyasnp
importmatplotlib.pyplotasplt
s=pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()
plt.show()
5.2 绘制四条折线图
df=pd.DataFrame(np.random.randn(10,4),
columns=list('ABCD'),
index=np.arange(0,100,10))
df.plot()M M33333
plt.show()
将DataFrame中各列的数据分配到不同的子图中 - subplots =True
df.plot(subplots=True)
5.3 在pandas中的绘图方法
5.3.1 通过Series.plot()方法绘图
5.3.2 通过DataFrame.plot()方法绘图
5.4 在pandas中绘制直方图/条形图
importmatplotlib.pyplotasplt
importpandasaspd
importnumpyasnp
fig,axes=plt.subplots(2,1)# 新建一个2行1列的画布
data=pd.Series(np.random.randn(16),
index=list('abcdefghijklmnop'))
data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)
data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)
plt.show()
5.5 在pandas中绘制箱线图
importmatplotlib.pyplotasplt
importpandasaspd
importnumpyasnp
fig=plt.figure()
ax=fig.add_subplot(111)
ax.boxplot(np.random.randn(16))
plt.show()
5.6 绘制柱状堆积图data.unstack().plot(kind='bar',stacked=True,color=['red','blue'])
# pandas读取excel文件
df=pd.read_excel("excel/pandas-matplotlib.xlsx","Sheet1")
df
5.6.1 年龄分布直方图
#创建一个空白的画板
figure=plt.figure()
#修改已创建的画板的大小
figure.set_size_inches(10,8)
#在画板上添加一个Axes绘图区域
ax=figure.add_subplot(111)
#在选中的绘图区域上绘制一个直方图
ax.hist(df["Age"],bins=7)
plt.title("年龄分布直方图")
plt.xlabel("年龄")
plt.ylabel("人数")
5.6.2 堆积图
#安装身体状况和性别进行分组后统计销售数量
var=df.groupby(["BMI",'Gender']).Sales.sum()
result=var.unstack()
result
result.plot(kind="bar",stacked=True,color=["r","g"])
5.7 散点图data.scatter(arr1,arr2)
fig=plt.figure()
ax=fig.add_subplot(111)
#根据年龄和销售数据量绘制散点图
ax.scatter(df["Age"],df["Sales"])
plt.show()
5.8 气泡图data.scatter(arr1,arr2,s=arr3)
根据arr3对应值的大小来显示不同大小的气泡
#绘制气泡图
fig=plt.figure()
ax=fig.add_subplot(111)
#根据年龄和销售数据量绘制散点图
ax.scatter(df["Age"],df["Sales"],s=df["Income"])
plt.show()
5.9 绘制饼图
#pandas绘制饼图
var=df.groupby("Gender").sum()
x_list=var["Sales"]
label_list=var.index
plt.axis("equal")
plt.pie(x_list,
labels=label_list,
startangle=90,
shadow=True,
explode=[0.05,0],
autopct="%1.1f%%")
plt.show()
6 Matplotlib番外篇 - pyecharts
6.1 pyecharts简介
6.2 pyecharts绘制图形
6.2.1 绘制柱状图
importpyecharts
#画简单的柱状图
frompyechartsimportBar
mybar=Bar("主标题","副标题")
# pyecharts遵循所有图表都先定义数据再进行展示
mybar.add("服饰",
["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],
[5,20,36,10,75,90])
#方法一:将图表渲染输出到html页面中
#savepath文件存储的路径,如果不传入参数,默认保存当前文件所在文件夹下
#mybar.render(savepath)
#方法二:直接再jupyter-notebook中展示
mybar
#一、柱状图
secondBar=Bar("主标题","副标题")
secondBar.add("服饰",
["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"],
[5,20,36,10,75,90],
is_more_utils=True)
# is_more_utils 是否显示最右侧的工具栏
secondBar
6.2.2 根据柱状图绘制堆积图
#二、根据柱状图,绘制堆积图
attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋"," 袜子"]
v1=[5,20,36,10,75,90]#商家A的各商品销量
v2=[10,25,8,60,20,80]#商家B各商品的销量
#添加标题
stackBar=Bar("柱状图数据堆叠示例")
#添加数据
stackBar.add("商家A",attr,v1,is_stack=True)
stackBar.add("商家B",attr,v2,is_stack=True)
stackBar
#二、根据柱状图,绘制堆积图
attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋"," 袜子"]
v1=[5,20,36,10,75,90]#商家A的各商品销量
v2=[10,25,8,60,20,80]#商家B各商品的销量
#添加标题
markBar=Bar("柱状图数据堆叠示例")
#添加数据
#柱状图添加标注点
markBar.add("商家A",attr,v1,mark_point=["average"])
#柱状图添加标注线
#is_convert : xy轴互换
markBar.add("商家B",attr,v2,mark_line=["max","min"],is_convert=True)
markBar
6.2.3 绘制折线图
#三、绘制折线图
frompyechartsimportLine
attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
v1=[5,20,36,10,10,100]
v2=[55,60,16,20,15,80]
myLine=Line("折线图示例")
myLine.add("商家A",attr,v1,mark_point=["average","max","min"])
#is_smooth 点之间是否用平滑曲线进行连接
myLine.add("商家B",attr,v2,is_smooth=True)
myLine
6.2.4 绘制折线图 - 标注点
#四、折线图修改标注点的形状和标注文字的字体颜色
attr=["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋"," 袜子"]
v1=[5,20,36,10,10,100]
v2=[55,60,16,20,15,80]
markLine=Line("添加标注点的折线图")
markLine.add("商家A",attr,v1,
mark_point=["min","average","max"],
mark_point_symbol="diamond",
mark_point_textcolor="#40ff27")
markLine.add("商家B",attr,v2,
mark_point=["min","average","max"],
mark_point_symbol="arrow",
mark_point_symbolsize=40)
'''
mark_point 标注点
mark_point_symbol 标注点的形状
mark_point_symbolsize 标注点的大小
mark_point_textcolor 标注点的字体颜色
'''
markLine
6.2.5 绘制折线图 - 面积图示例
#五、折线图-面积图示例
areaLine=Line("面积图示例")
areaLine.add("商家A",attr,v1,
is_fill=True,
line_opacity=0.2,
area_color="#00ff00",
area_opacity=0.4,
symbol=None)
areaLine.add("商家B",attr,v2,
is_fill=True,
area_color="#000",
area_opacity=0.3,
is_smooth=True)
'''
is_fill 为折线图所包裹的区域填充颜色
area_color 填充的颜色
area_opacity 填充区域背景的不透明度
line_opacity 线条的不透明度
'''
areaLine
6.2.6 绘制饼图
#六、绘制饼图
frompyechartsimportPie
myPie=Pie("饼图")
myPie.add("",attr,v1,is_label_show=True)
myPie
6.2.7 饼图 - 圆环图
#七、饼图-圆环图示例
pie=Pie("饼图-圆环图示例",title_pos='center')
pie.add("",attr,v1,is_label_show=True,
radius=[40,75],
label_text_color=None,
legend_orient="vertical",
legend_pos="left")
'''
label_text_color 标签的颜色
legend_orient 图例展开的方向 vertical/horizontal
legend_pos 图例的位置
radius 定义圆环图内圆和外圆的半径
'''
pie
6.2.8 绘制散点图
#八、绘制散点图
v1,v2# ([5, 20, 36, 10, 10, 100], [55, 60, 16, 20, 15, 80])
frompyechartsimportScatter
myScatter=Scatter("散点图示例")
v1=[10,20,30,40,50,60]
v2=[10,20,30,40,50,60]
#添加数据
myScatter.add("A组",v1,v2,
is_visualmap=True,
visual_type="size",
visual_range_size=[20,80])
myScatter.add("B组",v1[::-1],v2,
is_visualmap=True,
visual_type="size",
visual_range_size=[20,80])
myScatter
6.2.9 绘制地图
#九、绘制地图
frompyechartsimportMap
attr=["福建","山东","北京","上海"]
value=[155,10,66,78]
chinaMap=Map("地图示例",
width=400,
height=150)
chinaMap.add("",attr,value,
maptype="china")
chinaMap.render("china.html")