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
相关产品推荐
相关产品推荐

