Python 用matplotlib在笛卡尔空间中绘制角度包裹数据

Python 用matplotlib在笛卡尔空间中绘制角度包裹数据,python,plot,matplotlib,axes,Python,Plot,Matplotlib,Axes,也许我把标题弄得比问题更复杂了,但现在是 我有一些角度数据,在x-y平面上连续,跨越360=>0度线-即358359,0,1,2 如果我正在绘制这些并设置: plt.xlim(0,360) 当然,我在图的最左边有三个点,在最右边有两个点。您可以在(更复杂、更实际的)图中看到这一点(x轴限制故意颠倒): 我真正想要的是在绘图窗口中的相同位置绘制所有点,可能朝向绘图的中心。在该方案下,x轴在360-0度边界的左侧减小,在右侧增大 我不想对数据本身进行任何转换/转移(它是一个大数据集,等等),因

也许我把标题弄得比问题更复杂了,但现在是

我有一些角度数据,在x-y平面上连续,跨越360=>0度线-即358359,0,1,2

如果我正在绘制这些并设置:

 plt.xlim(0,360)
当然,我在图的最左边有三个点,在最右边有两个点。您可以在(更复杂、更实际的)图中看到这一点(x轴限制故意颠倒):

我真正想要的是在绘图窗口中的相同位置绘制所有点,可能朝向绘图的中心。在该方案下,x轴在360-0度边界的左侧减小,在右侧增大

我不想对数据本身进行任何转换/转移(它是一个大数据集,等等),因此我希望通过一些matplotlib技巧来实现这一点

我计划用hexbin绘制数据点,如果这有什么不同的话

感谢您的关注,并提前感谢您的帮助


Dave

老实说,我认为转换数据会快得多
x[x>180]-=360
相当快。除非数据集的大小为几GB,否则转换数据所需的时间仅为几毫秒

因此,这里有一个简单的方法(转换数据):

导入matplotlib.pyplot作为plt
将numpy作为np导入
#生成与您的匹配的数据。。。
y=60*np.随机。随机(300)-20
x=60*(np.随机。随机(300)-0.5)
x[x<0]+=360
#将数据转换回-180到180范围。。。
x[x>180]-=360
#绘制数据
图,ax=plt.子批次()
ax.图(x,y,'b.)
#设置记号,使负记号表示>180个数字
ticks=ax.getxticks()
滴答声[滴答声<0]+=360
ax.set_xticklabels([int(勾号)表示勾号中的勾号])
plt.show()

但是,如果您想避免转换数据,可以这样做。。。不过,这比仅仅转换数据要慢100%。(速度可能慢得可以忽略不计,但不会更快。)

导入matplotlib.pyplot作为plt
将numpy作为np导入
#生成与您的匹配的数据。。。
y=60*np.随机。随机(300)-20
x=60*(np.随机。随机(300)-0.5)
x[x<0]+=360
图(ax1,ax2)=plt.子批次(ncols=2,sharey=True)
图子批次调整(wspace=0)
ax1.脊椎['right'].set_可见(False)
ax2.脊椎['left'].set_可见(False)
ax1.勾选参数(右=假)
ax2.勾选参数(左=假)
对于ax2中的标签。获取\u yticklabels():
label.set_可见(False)
ax1.绘图(x[x>180],y[x>180],“b.”)

ax2.plot(x[x我想到的最简单的“技巧”是将数据打印两次,即使用偏移的x值打印相同的内容,以便第二个值的左侧与第一个值的右侧一致(
x_new=x_old+360
)。这是一个选项吗?+1
x[x<0]
uau!那是什么?numpy?请你添加一个链接到关于这个美丽的相关文档中好吗?这是一个numpy习惯用法(也是一个“matlab ism”)(链接到教程,而不是文档。文档的相关部分假设对numpy更熟悉。)numpy数组上的逻辑操作返回布尔数组。这些可以(除其他外)可用于索引相同形状的numpy数组。
import matplotlib.pyplot as plt
import numpy as np

# Generate data to match yours...
y = 60 * np.random.random(300) - 20
x = 60 * (np.random.random(300) - 0.5)
x[x < 0] += 360

# Transform the data back to a -180 to 180 range...
x[x > 180] -= 360

# Plot the data
fig, ax = plt.subplots()
ax.plot(x, y, 'b.')

# Set the ticks so that negative ticks represent >180 numbers
ticks = ax.get_xticks()
ticks[ticks < 0] += 360
ax.set_xticklabels([int(tick) for tick in ticks])

plt.show()
import matplotlib.pyplot as plt
import numpy as np

# Generate data to match yours...
y = 60 * np.random.random(300) - 20
x = 60 * (np.random.random(300) - 0.5)
x[x < 0] += 360

fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
fig.subplots_adjust(wspace=0)

ax1.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax1.tick_params(right=False)
ax2.tick_params(left=False)
for label in ax2.get_yticklabels():
    label.set_visible(False)

ax1.plot(x[x > 180], y[x > 180], 'b.')
ax2.plot(x[x <= 180], y[x <= 180], 'b.')

ax2.set_xticks(ax2.get_xticks()[1:])

plt.show()