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

Matplotlib绘制半极坐标图:双图重叠及c30显示异常求解

解决半极坐标图并排布局与图形异常问题

问题诊断

  1. 子图重叠:创建子图时未指定布局位置,add_subplot(projection='polar')默认将所有子图放在同一画布位置,导致两个图重叠。
  2. c30图形异常(显示为直线):计算c30的笛卡尔坐标x值时,错误使用np.sin替代np.cos,使得x和y值完全一致,所有点落在直线y=x上,最终呈现为一条线。

修复后的代码

import numpy as np
from scipy import interpolate
import pandas as pd
import matplotlib.pyplot as plt

# 数据定义
c31df = pd.DataFrame({'measure':[0,7.52,7.91,8.57,8.9,8.94,9.36,9.21,7.97,6], 
                      'angle':[0,52,60,75,90,110,120,135,150,180]})
c30df = pd.DataFrame({'measure':[0,5.1,7.26,7.58,8.1,8.46,8.51,8.9,8.94,7.87], 
                      'angle':[0,52,60,75,90,110,120,135,150,180]})

# 修正c30x的计算:使用cos而非sin
c31x = c31df.measure[:-1] * np.cos(c31df.angle[:-1]/180*np.pi)
c31y = c31df.measure[:-1] * np.sin(c31df.angle[:-1]/180*np.pi)
c30x = c30df.measure[:-1] * np.cos(c30df.angle[:-1]/180*np.pi)  # 此处修正
c30y = c30df.measure[:-1] * np.sin(c30df.angle[:-1]/180*np.pi)

# 闭合曲线
c31x = np.r_[c31x, c31x[0]]
c31y = np.r_[c31y, c31y[0]]
c30x = np.r_[c30x, c30x[0]]
c30y = np.r_[c30y, c30y[0]]

# 曲线插值
c31tck, c31u = interpolate.splprep([c31x, c31y], s=0, per=True)
c31xi, c31yi = interpolate.splev(np.linspace(0,1,1000), c31tck)
c30tck, c30u = interpolate.splprep([c30x, c30y], s=0, per=True)
c30xi, c30yi = interpolate.splev(np.linspace(0,1,1000), c30tck)

# 笛卡尔坐标转极坐标
def cart2pol(x,y):
    rho = np.sqrt(x**2+y**2)
    phi = np.arctan2(y,x)
    return(rho, phi)

# 创建1行2列的子图布局
fig = plt.figure(figsize=(12,8))
# 第一个子图(左):c31
c31ax = fig.add_subplot(121, projection='polar')
c31ax.set_theta_zero_location('N')
c31ax.set_theta_direction(1)
c31ax.set_thetamax(180)
c31ax.plot(cart2pol(c31xi, c31yi)[1], cart2pol(c31xi, c31yi)[0], 
           linewidth=1, linestyle='solid', color='red', label='c31 Chart')
c31ax.legend()

# 第二个子图(右):c30
c30ax = fig.add_subplot(122, projection='polar')
c30ax.set_theta_zero_location('N')
c30ax.set_theta_direction(-1)
c30ax.set_thetamax(180)
c30ax.plot(cart2pol(c30xi, c30yi)[1], cart2pol(c30xi, c30yi)[0], 
           linewidth=1, linestyle='solid', color='green', label='c30 Chart')
c30ax.legend()

plt.tight_layout()
plt.show()

关键修改点

  • 子图布局:将add_subplot(projection='polar')改为add_subplot(121, projection='polar')和add_subplot(122, projection='polar'),其中121表示1行2列的第1个位置,122表示第2个位置,实现并排布局。
  • 坐标计算修正:把c30x的计算从np.sin改为np.cos,确保笛卡尔坐标的x和y分别对应极坐标的水平和垂直分量,正确生成曲线。

内容的提问来源于stack exchange,提问作者Alex Mills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:54:55