matplotlib绘图–本次图形涉及(并列)条形图、(堆积)柱状图、饼图、折线图、阶梯图、散点图、极线图、气泡图;
子区划分:subplots()、gridspec()、add_axes()。
python可视化绘制蜘蛛侠、钢铁侠
这学期学的Python可视化在重点学matplotlib库,于是想用该库里的绘图函数来组合一些有趣的画面,这里并没有用上任何的数据进行分析,只是为了熟悉一些绘图函数。
绘图思路
- 构思草图;
- 划分子区;
- 绘图函数绘图;
结果图:
代码
①设置画布、划分子区:
这部分是子图划分,关于子图划分函数我根据资料和自己的理解写了一些解释放在这里(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 = 8
theta1 = 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可视化需要结合到数据分析上才是其初衷。