You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib绘制2*2子图单极坐标图报错:AxesSubplot无polar属性

在Matplotlib 2*2子图中仅创建单个极坐标图的解决方法

问题原因

你遇到的报错是因为axs[3]是默认的笛卡尔坐标系Axes对象,它本身没有polar()方法;而subplot_kw=dict(polar=True)会统一设置所有子图的属性,导致全部变成极坐标,不符合需求。

两种可行解决方案

方案1:替换指定位置的子图为极坐标

先创建常规的2*2子图布局,删除不需要的普通Axes,再在对应位置添加极坐标Axes:

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data_hist = np.random.randn(1000)
data_line = np.random.randn(50).cumsum()
data_scatter_x = np.random.randn(50)
data_scatter_y = np.random.randn(50)
data_radar_theta = np.random.rand(3) * 2 * np.pi
data_radar_r = np.random.rand(3) * 10  # 补充径向数据,让极坐标图更合理

# 创建2*2子图布局
fig, axs = plt.subplots(2, 2)
axs = axs.flatten()

# 绘制直方图
axs[0].hist(data_hist, bins=50, color='steelblue', edgecolor='black')
axs[0].set_title('Histogram')

# 绘制折线图
axs[1].plot(data_line, color='r', marker='o')
axs[1].set_title('Line plot')

# 绘制散点图
axs[2].scatter(data_scatter_x, data_scatter_y, color='g')
axs[2].set_title('Scatter plot')

# 删除第4个普通Axes,替换为极坐标Axes
axs[3].remove()
ax_polar = fig.add_subplot(2, 2, 4, polar=True)
ax_polar.plot(data_radar_theta, data_radar_r, marker='o')
ax_polar.set_title('Radar plot')

plt.tight_layout()
plt.show()

方案2:手动逐个创建子图

直接通过fig.add_subplot()逐个创建子图,最后一个指定polar=True:

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
data_hist = np.random.randn(1000)
data_line = np.random.randn(50).cumsum()
data_scatter_x = np.random.randn(50)
data_scatter_y = np.random.randn(50)
data_radar_theta = np.random.rand(3) * 2 * np.pi
data_radar_r = np.random.rand(3) * 10

fig = plt.figure()

# 创建第一个子图(直方图)
ax0 = fig.add_subplot(2, 2, 1)
ax0.hist(data_hist, bins=50, color='steelblue', edgecolor='black')
ax0.set_title('Histogram')

# 创建第二个子图(折线图)
ax1 = fig.add_subplot(2, 2, 2)
ax1.plot(data_line, color='r', marker='o')
ax1.set_title('Line plot')

# 创建第三个子图(散点图)
ax2 = fig.add_subplot(2, 2, 3)
ax2.scatter(data_scatter_x, data_scatter_y, color='g')
ax2.set_title('Scatter plot')

# 创建第四个子图(极坐标图)
ax3 = fig.add_subplot(2, 2, 4, polar=True)
ax3.plot(data_radar_theta, data_radar_r, marker='o')
ax3.set_title('Radar plot')

plt.tight_layout()
plt.show()

补充说明

原代码中用同一组数据同时作为极坐标的角度和径向值不太合理,所以上面的代码补充了独立的径向数据data_radar_r,让极坐标图的展示更符合逻辑。

内容的提问来源于stack exchange,提问作者Janson Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:24:28