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

3
也许我的标题比问题更复杂,但是这里有...!
我有一些角度数据,连续分布在x-y平面上,跨越360 => 0度线 - 即358、359、0、1、2等。
如果我要绘制它们并设置:
 plt.xlim(0,360)

我当然会在图的最左侧有三个点,并在最右侧有两个点。您可以在此处查看更复杂和实际的情节(x轴限制故意反转): angularly-wrapped dataset 我真正想要的是将所有点绘制在图窗口中相同的位置,可能朝向图的中心。在此方案下,x轴在360-0度边界左侧减小,在右侧增加。
我不想对数据本身进行任何翻译/移位(它是一个大型数据集等),因此我将寻求使用一些matplotlib技巧来完成此操作。
如果可以的话,我计划使用hexbin绘制数据点。
感谢您的关注,也感谢您提前的帮助,
戴夫

我能想到最简单的“技巧”是将数据绘制两次,即使用移动的x值绘制相同的内容,以便第二个图形的左侧与第一个图形的右侧重合(x_new = x_old + 360)。这是一个选项吗? - Avaris
1个回答

4
我认为仅仅转换数据会更快。 x[x>180] -= 360 的速度相当快。除非你的数据集大小为几个GB,否则转换数据只需要几毫秒时间。因此,这里提供了一种简单的方法(转换数据):
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()

enter image description here

但是,如果你想避免转换数据,可以像这样做... 然而,这种方法保证比转换数据慢,尽管可能只是稍稍慢一点,但它不会更快。

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()

enter image description here


+1 x[x < 0] 这是什么?Numpy?能否请您添加相关文档的链接呢? - joaquin
这是一个numpy惯用语(也是“matlab-ism”)。http://www.scipy.org/Tentative_NumPy_Tutorial#head-d55e594d46b4f347c20efe1b4c65c92779f06268(链接是教程,而不是文档。文档的相关部分假定对numpy有更多的熟悉度。)numpy数组上的逻辑操作返回布尔数组。这些可以(除其他外)用于索引相同形状的numpy数组。 - Joe Kington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接