2011-11-23 62 views
3

也许我已经提出了标题比问题更复杂,但是这里有...!用matplotlib绘制笛卡尔空间中有角度缠绕的数据

我有一些角度数据,在xy平面上邻接的,即跨在360 => 0度线 - 即,358,359,0,1,2 ....

如果我正在策划这些和设置:

plt.xlim(0,360) 

我当然会有三个点在剧情的最左边,两个在最右边。你可以在这里(比较复杂,与实际)地块看到这个(x轴限制故意颠倒):

the angularly-wrapped dataset

我真正喜欢的是把所有点左右在相同的位置绘制情节窗口,也许朝向情节的中心。在这个方案下,x轴减小到360-0度边界的左边,并且增加到右边。

我不想对数据本身进行任何翻译/转换(这是一个大型的数据集等),所以我会用matplotlib这个技巧来做这件事。

我打算用hexbin绘制数据点,如果这有什么区别的话。

为希望感谢,并感谢您在您的帮助,

戴夫

+0

最简单的“绝招”。这使我的心是两次策划你的数据,即具有变化的x值绘制同样的东西所以第二个的左边与第一个的右边相重合('x_new = x_old + 360')。这是一个选项吗? – Avaris

回答

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

但是,如果你想避免将您的数据,你可以做这样的事情......这是100不过,保证%的速度比转换数据要慢。 (也许可以忽略慢,但它不会更快。)

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

+0

+1'x [x <0]'uau!那是什么? numpy的?请你可以添加一个链接到相关的美容文件? – joaquin

+0

这是一个numpy成语(也是“matlab-ism”)。 http://www.scipy.org/Tentative_NumPy_Tutorial#head-d55e594d46b4f347c20efe1b4c65c92779f06268(该链接是一个教程,而不是文档。文档的相关部分假定您更熟悉numpy。)numpy数组上的逻辑运算返回布尔值阵列。这些可以(除其他外)用于索引相同形状的numpy数组。 –