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 = 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可视化需要结合到数据分析上才是其初衷。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值