Matplotlib之subplot分格显示 2

本文详细介绍使用Matplotlib的subplot2grid(), Gridspec()及subplots()函数进行复杂子图布局的方法,通过实例演示如何创建不同大小和位置的子图,以满足数据可视化的需求。

1.方法一:subplot2grid()函数

例一:用subplot2grid()函数画出下图中的函数:

代码如下:

import matplotlib.pyplot as plt
from numpy import *
x=linspace(0,1,5)

plt.figure()
#将图片分为3行3列,从第1行第1列开始显示,函数跨3列1行
plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)
y1=x
plt.plot(x,y1)
#将图片分为3行3列,从第2行第1列开始显示,函数跨2列1行
plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=1)
y2=x**2
plt.plot(x,y2)
#将图片分为3行3列,从第2行第3列开始显示,函数跨1列2行
plt.subplot2grid((3,3),(1,2),colspan=1,rowspan=2)
y3=x**3
plt.plot(x,y3)
#将图片分为3行3列,从第3行第1列开始显示,图像跨1列1行
plt.subplot2grid((3,3),(2,0))
plt.scatter(x,y1)
#将图片分为3行3列,从第3行第2列开始显示,图像跨1列1行
plt.subplot2grid((3,3),(2,1))
plt.scatter(x,y3)

plt.show()

注:

plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1):将图分为3行3列,行和列的编号从0开始,声明从第1行第1列(即第一个格)开始画这个图像,函数图像跨3列(colspan)1行(rowspan)。

2.方法二:Gridspec()函数

例二:将上图用Gridspec()函数展示出来。

代码如下:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from numpy import *
x=linspace(0,1,5)

plt.figure()
gs=gridspec.GridSpec(3,3)  #将区域分为3行3列

#1.将函数画在第1行跨123列
plt.subplot(gs[0,:])
y1=x
plt.plot(x,y1)
#2.将函数画在第2行跨12列
plt.subplot(gs[1,:2])  #跨编号为0,1的列
y2=x**2
plt.plot(x,y2)
#3.将函数画在第3列跨23行
plt.subplot(gs[1:,2])  #跨编号为1,2的行
y3=x**3
plt.plot(x,y3)
#4.将函数画在第3行第1列
plt.subplot(gs[-1,0])   #-1表示最后一行,也可以写成2
plt.scatter(x,y1)
#5.将函数画在第3行第2列
plt.subplot(gs[2,1])
plt.scatter(x,y2)

plt.show()

注:

注意在使用GridSpec函数是要import matplotlib.gridspec

gs=gridspec.GridSpec(3,3),将区域分为3行3列,并返回一个3行3列的对象.

plt.subplot(gs[0,:]),将图像显示在第1行的1,2,3列。

举例说明[1,:],[:,1]等的含义,假设有4行4列,编号从0开始0,1,2,3:

  1. [1,:]       表示1行0,1,2,3列
  2. [1,:2]     表示1行0,1列
  3. [0,2:]     表示0行2,3列
  4. [1:,1]     表示1,2,3行1列
  5. [:,1]       表示0,1,2,3行1列

3.方法三:subplots()函数

例三:将下图用subplots()函数画出来

代码如下:

import matplotlib.pyplot as plt
from numpy import *

x=linspace(0,1,10)
fig,ax=plt.subplots(2,2,sharex=False,sharey=True)   #将区域分为2行2列,所有的部分共享y轴,不共享x轴
y1=x
y2=x**2

ax[0][0].plot(x,y1)
ax[0][1].scatter(x,y1)
ax[1][0].plot(x,y2)
ax[1][1].scatter(x,y2)

plt.show()

注:

fig,ax=plt.subplots(2,2,sharex=False,sharey=True)   #将区域分为2行2列,所有的部分共享y轴,不共享x轴,函数返回一个Figure对象和一个子图数组

 

<think>好的,用户想用Matplotlib绘制性格析的雷达图。之前他们提到了性格色彩测试,可能现在需要将测试结果可视化。我需要结合用户提供的引用中的代码示例,特别是引用[3]和[4]里关于霍兰德职业兴趣测试的雷达图,来指导如何绘制性格相关的雷达图。首先,用户可能需要明确数据结构和性格维度。比如性格色彩为红、蓝、黄、绿四种,或者其他的类方式。每个维度对应一个数,需要在雷达图上展示出来。接下来,步骤应该是准备数据、设置极坐标、绘制线条和填充、添加标签和美化图表。引用中的代码示例已经展示了如何闭合数据点,使用np.concatenate来连接首尾数据,这点很重要,否则雷达图无法闭合。然后,要注意中文字体的显示问题,用户之前的引用提到设置plt.rcParams['font.sans-serif']为SimHei,这样可以防止中文乱码。同时,极坐标的角度需要根据维度数量均匀配,比如四个性格维度的话,角度应该是0到2π成四个点,然后闭合。另外,用户可能需要自定义颜色和样式,比如不同性格类型用不同颜色,填充透明度调整等。引用[1]中的例子调整了颜色和透明度,可以作为参考。还需要考虑如何设置标签,每个维度对应的性格类型名称应该正确显示在对应的轴上。引用[3]中的thetagrids方法可以用来设置标签的位置和内容。最后,可能需要生成相关问题,比如如何优化雷达图的可视化效果,或者如何处理多人的数据对比。根据用户之前的问题,他们可能对测试结果的可信度和应用场景感兴趣,所以相关问题可以围绕这些方面展开。</think>根据您对性格析的可视化需求,结合Matplotlib雷达图绘制技术,以下是步骤实现方案: ### 一、数据准备阶段 假设性格测试包含4个维度(例:红/蓝/黄/绿性格色彩),每个维度得区间为$[0,100]$,示例数据: ```python dimensions = ['行动力', '逻辑性', '领导力', '同理心'] # 性格维度标签 scores = [75, 90, 65, 85] # 各维度得 ``` ### 二、核心绘制流程 ```python import numpy as np import matplotlib.pyplot as plt # 1. 基础设置 plt.rcParams['font.sans-serif'] = 'SimHei' # 解决中文显示问题[^4] plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 2. 角度计算与数据闭合 num_vars = len(dimensions) angles = np.linspace(0, 2*np.pi, num_vars, endpoint=False).tolist() angles += angles[:1] # 首尾闭合[^3] scores += scores[:1] # 数据闭合 # 3. 创建极坐标图 fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(111, polar=True) # 4. 绘制多边形 ax.plot(angles, scores, color='#1E90FF', linewidth=2, linestyle='solid') ax.fill(angles, scores, color='#87CEEB', alpha=0.4) # 填充颜色与透明度[^1] # 5. 设置刻度标签 ax.set_theta_offset(np.pi/2) # 旋转0度到顶部 ax.set_theta_direction(-1) # 顺时针排列维度 ax.set_rlabel_position(30) # 数值标签显示角度 plt.ylim(0,100) # 数值范围 # 6. 添加标签与网格 ax.set_xticks(angles[:-1]) ax.set_xticklabels(dimensions, fontsize=12) ax.set_yticks([20,40,60,80,100]) ax.grid(True, color='gray', linestyle=':', linewidth=0.5) plt.title("性格特质析雷达图", fontsize=14, pad=20) plt.show() ``` ### 三、关键参数说明 1. **角度闭合计算**: 使用`np.linspace`生成等角度时需设置`endpoint=False`,确保最后一个角度不重复计算[^3]。闭合处理通过`angles += angles[:1]`实现 2. **样式优化技巧**: ```python # 修改线条样式 ax.plot(angles, scores, marker='o', markersize=8, markerfacecolor='red', markeredgewidth=1) # 添加数据标签 for angle, score in zip(angles[:-1], scores[:-1]): ax.text(angle, score+5, str(score), ha='center', va='bottom') ``` 3. **多数据对比**: ```python # 添加第二组数据 scores2 = [60, 75, 80, 70] scores2 += scores2[:1] ax.plot(angles, scores2, color='#FF4500', linewidth=2) ax.fill(angles, scores2, color='#FFA07A', alpha=0.3) ``` ### 四、效果优化建议 1. **颜色映射**:使用`plt.cm.viridis`颜色映射实现数据梯度可视化 2. **动态交互**:结合`mplcursors`库添加数据点悬停提示 3. **3D效果**:通过`ax.plot(angles, scores, zorder=1)`调整图层叠放顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值