admin 管理员组

文章数量: 1086866

python可视化之matplotlib绘图

matplotlib绘图–本次图形涉及(并列)条形图、(堆积)柱状图、饼图、折线图、阶梯图、散点图、极线图、气泡图;
子区划分:subplots()、gridspec()、add_axes()。

python可视化绘制蜘蛛侠、钢铁侠

这学期学的Python可视化在重点学matplotlib库,于是想用该库里的绘图函数来组合一些有趣的画面,这里并没有用上任何的数据进行分析,只是为了熟悉一些绘图函数。

绘图思路

  1. 构思草图;
  2. 划分子区;
  3. 绘图函数绘图;

结果图:

代码

①设置画布、划分子区:

这部分是子图划分,关于子图划分函数我根据资料和自己的理解写了一些解释放在这里(7种子区划分)。

#导入库
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import matplotlib.gridspec as gridspec
import random
#---------------------------------------
#划分子图
#上区域图
fig1 = plt.figure(figsize=(10,1))
ax1,ax2 = fig1.subplots(1,2)
#调整ax1,ax2之间的垂直间隙
#这里用None没效果换成数值(right、left、top、bottom)
plt.subplots_adjust(wspace=0.2)
#下区域图
fig2 = plt.figure(figsize=(10,10))
gs = gridspec.GridSpec(5,5)
ax3 = plt.subplot(gs[2:4,1])
ax4 = plt.subplot(gs[2:4,4])
ax5 = plt.subplot(gs[4,0:])
ax6 = plt.subplot(gs[2:4,0])
ax7 = plt.subplot(gs[0:2,0:2])
ax9 = plt.subplot(gs[2:4,2:4])
plt.subplots_adjust(hspace=-0.1,wspace=0)

②绘制上区域fig1画布内容

#子图样式设置
#条形图(上区域子图1)
x = 0.5
barh_width=0.6
ax1.barh(x,0.6,align="center",color="#1468B1")
ax1.barh(x+barh_width,1,align="center",color="#E34346")
ax1.set_xlim(0,1)
#条形图(上区域子图2)
ax2.barh(x,0.6,align="center",color="#1468B1")
ax2.barh(x+barh_width,1,align="center",color="#E34346")
ax2.set_xlim(1,0)#逆向
ax2.text(1.17,1,"VS",fontsize=25)
#关闭子区坐标轴
ax1.axis("off")
ax2.axis("off")

(下面都是下区域fig2画布内容)

③绘制蜘蛛侠的手和身体

x1 = 0
x2 = [-0.5,0.5]
x3 = [-1,-0.6,0.6,1]
y1 = [-1.5,-1,-1,-1.5]#折线图绘制蜘蛛侠的手
ax3.plot(x3[0:2],y1[0:2],color="#4440FE",marker='o',ms=15,mfc="#C40004",)
ax3.plot(x3[2:4],y1[2:4],color="#4440FE",marker='o',ms=15,mfc="#C40004",)
#堆积柱状图绘制蜘蛛侠的身体
ax3.bar(x1,-0.95,width=1.2,color="#000000",)
ax3.bar(x1,-0.55,width=1.2,bottom=-0.95,color="#C40004",)
ax3.bar(x1,-0.5,width=1.2,bottom=-1.5,color="#4440FE",)ax3.bar(x2,-0.4,width=0.7,bottom=-2,color="#C40004")

④绘制钢铁侠的手和身体

#折线图绘制钢铁侠的手
#x3 = [-1,-0.6,0.6,1]
#y1 = [-1.5,-1,-1,-1.5]
ax4.plot([-1.1,-0.6],[-1.2,-1],color="#F6E72F",marker='o',ms=15,mfc="#C40004",)
ax4.plot(x3[2:4],y1[2:4],color="#F6E72F",marker='o',ms=15,mfc="#C40004",)
#堆积柱状图绘制钢铁侠的身体
ax4.bar(x1,-0.95,width=1.2,color="#000000",)
ax4.bar(x1,-0.55,width=1.2,bottom=-0.95,color="#C40004",)
ax4.bar(x1,-0.5,width=1.2,bottom=-1.5,color="#F6E72F",)ax4.bar(x2,-0.4,width=0.7,bottom=-2,color="#C40004")

⑤ 绘制两者头部

#内嵌饼图绘制蜘蛛侠的头
weight1 = [1]
weight2 = [0.3,0.20,0.3]out_colors = ["#C40004"]
inner_colors1 = ["#FFFFFF","#C40004","#FFFFFF"]ax3.pie(weight1,colors=out_colors      )
ax3.axis('equal')
ax3.pie(weight2,radius=0.75,startangle=-55,colors=inner_colors1,explode=(0.1,0.0,0.1))#内嵌饼图绘制钢铁侠的头
weight3 = [0.05, 0.15, 0.15, 0.15, 0.05, 0.45]
inner_colors2 = ["#FFFFFF","#F6E72F","#C40004","#F6E72F","#FFFFFF","#F6E72F"]ax4.pie(weight1,colors=out_colors,)
ax4.axis('equal')
ax4.pie(weight3,radius=0.8,startangle=-10,colors=inner_colors2)

⑥绘制地面

#阶梯图绘制地面
x4 = np.linspace(0,10,60)
y2 = np.random.rand(60)ax5.step(x4,y2,color="#5C370D",where="pre",lw=2,)
ax5.set_xlim(0,10)
ax5.set_ylim(0,1)
ax5.axvspan(xmin=0,xmax=10,facecolor="#704A23")
ax5.axis([0,10,0.3,0.7])#调整图形紧凑度
ax5.axis("off")

⑦绘制树干树叶

#条形图和柱状图绘制树干
#这里的参数调整和xy轴调整是为了让树干贴合地面
x5 = [0.5,1]
y3 = [9.5,9.5]
ax6.barh(9.5, 2.5,color="#7A5223",hatch="/-")
ax6.bar(x5,y3,color="#7A5223",width=1,hatch="/-")ax6.set_xlim(0,3)
ax6.set_ylim(-0.5,9.5)
ax6.axis("off")#---------------------------------------
#散点图绘制树叶
for i in range(5):color_tree = ["#4EE376","#09A734","#09A734","#009424","#009424"]a = 0.3+(0.05*i)x6 = [a,2*a,3*a,4*a,5*a]y4 = [i,i,i,i,i]ax7.scatter(x6,y4,color=color_tree[i],s=10000*0.4*i,marker='o')ax7.set_xlim(0,5)
ax7.set_ylim(0.2,5)
ax7.axis("off")

⑧绘制蜘蛛网

#极线图绘制蜘蛛网
ax8 = fig2.add_axes([0.4,0.3,0.2,0.2],projection='polar')#把子图设置为极坐标for i in range(9):   num = 8theta1 = np.linspace(0,2*np.pi,num)r1 = np.array([i,i,i,i,i,i,i,i])ax8.plot(theta1,r1,color="#9B9B9B",alpha=0.6)
#米字网    
for i in range(8):  theta2 = np.linspace(0,3/4*i*np.pi,2)r2 = np.array([0,8])ax8.plot(theta2,r2,color="#9B9B9B",alpha=0.6)
ax8.axis("off") 

⑨绘制光波/束

#折线图绘制光束
x8 = np.random.rand(50)
y6 = np.random.rand(50)
ax9.set_ylim(-0.5,2)
ax9.set_xlim(1,0.5)
for i in range(3):ax9.plot([0.5,0.9],[0.1*i,0.1*i],color="#FFF065",lw=6)#气泡图绘制冲击波    
ax9.scatter(x8,y6,s=np.power(10*x8+20*y6,2),#c=np.random.rand(50), #colormap缩写,设置后显示红黄蓝三色映射#cmap=mpl.cm.RdYlBu,c="#FFF065",#散点标记的颜色marker='o',alpha=0.8)
ax9.axis("off") 

结束

只要熟悉某一个绘图库的绘图函数、辅助层函数以及子区划分,Python绘图就可以组合出任意的图画。但归根结底Python可视化需要结合到数据分析上才是其初衷。

本文标签: python可视化之matplotlib绘图