如何更优实现90-270度数据在笛卡尔平面散点图以0为中心?
更优的实现方式
先提个小问题:你原代码里的导入写错了,应该是import matplotlib.pyplot as plt,不是import matplotlib as plt,不然运行会报错。
下面是几个更简洁、可维护性更高的优化方向:
1. 简化角度转换逻辑
你当前的角度转换公式可以改成更直观的写法,效果完全一致,但可读性更强:
ang = np.array([0, 90, 270]) radi = [1, 2, 3] # 把0-360度映射到-180-180度区间 ang_converted = np.mod(ang - 180, 360) - 180
这个公式的逻辑是:先把所有角度偏移180度,取模360后再偏移回-180度基准,比你原来的嵌套运算更易懂。
2. 自动生成轴标签,不用手动写死
不需要手动创建labels列表,直接根据转换后的x轴位置映射回原始角度就行,数据变了也不用改标签代码:
fig, ax = plt.subplots() ax.scatter(ang_converted, radi) # 按转换后的角度排序,匹配原始角度作为刻度标签 sorted_indices = np.argsort(ang_converted) ax.set_xticks(ang_converted[sorted_indices]) ax.set_xticklabels(ang[sorted_indices], rotation='vertical')
3. 可选:固定x轴范围,强化0为中心的视觉效果
如果想让图表更明显地以0为中心,可以手动设置x轴的上下限:
ax.set_xlim(-180, 180)
这样x轴的中点正好是0,视觉上完全符合你的需求。
完整优化后的代码
import numpy as np import matplotlib.pyplot as plt ang = np.array([0, 90, 270]) radi = [1, 2, 3] # 角度转换为-180~180区间 ang_converted = np.mod(ang - 180, 360) - 180 fig, ax = plt.subplots() ax.scatter(ang_converted, radi) # 自动匹配刻度与原始角度标签 sorted_idx = np.argsort(ang_converted) ax.set_xticks(ang_converted[sorted_idx]) ax.set_xticklabels(ang[sorted_idx], rotation='vertical') # 可选:固定x轴范围,强化中心视觉 ax.set_xlim(-180, 180) plt.show()
内容的提问来源于stack exchange,提问作者vicemagui
相关产品推荐
相关产品推荐

