Matplotlib绘制半极坐标图:双图重叠及c30显示异常求解
解决半极坐标图并排布局与图形异常问题
问题诊断
- 子图重叠:创建子图时未指定布局位置,
add_subplot(projection='polar')默认将所有子图放在同一画布位置,导致两个图重叠。 - 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
相关产品推荐
相关产品推荐

