2011-11-23 2 views
3

아마도이 제목을 질문보다 복잡하게 만들었지 만 여기에 ...!matplotlib을 사용하여 데카르트 공간에서 각도로 감싼 데이터를 플롯하는 경우

나는 360 => 0도 선을 걸쳐 xy 평면에서 연속 어떤 각도 데이터를,이 - 나는이 및 설정을하려한다면 즉, 358,359,0,1,2 ....

을 :

plt.xlim(0,360) 

물론 맨 왼쪽에는 3 개의 점이 있고 맨 오른쪽에는 2 개의 점이 있습니다. 당신은 여기에 (더 복잡하고 실제) 플롯에서 볼 수 있습니다 (x 축 제한은 의도적으로 반전) :

the angularly-wrapped dataset

내가 좋아 정말 줄 것은 모든 점은 같은 위치에서 주위를 그려하는 것입니다 어쩌면 음모의 중심을 향한 음모 창. 이 구성표에서 x 축은 360-0 각도 경계의 왼쪽으로 감소하고 오른쪽으로 증가합니다.

데이터 자체 (많은 양의 데이터 세트 등)에 대한 번역/이동을 원하지 않으므로 일부 matplotlib-trickery를 사용하여이 작업을 수행 할 것입니다.

데이터 뱅크를 헥스 빈으로 플로팅 할 계획입니다.

찾고 주셔서 감사합니다, 그리고, 당신의 도움에 미리 감사

데이브

+0

이동 X 값과 같은 물건을 플롯, 두 번, 즉 데이터를 음모 내 마음에 오는 가장 쉬운 '트릭' 두 번째 것의 왼쪽은 첫 번째 것의 오른쪽과 일치합니다 ('x_new = x_old + 360'). 이 옵션이 있습니까? – Avaris

답변

4

솔직히 단지 훨씬 더 빨리 될 것입니다 데이터를 변환 생각합니다. x[x>180] -= 360은 매우 빠릅니다. 데이터 세트의 크기가 몇 GB가 아니라면 데이터를 변환하는 데 걸리는 시간은 수 밀리 초에 불과합니다.

그래서, 여기에 (데이터 변환) 쉬운 방법 : 당신이 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 

# 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

+0

+1'x [x <0]'uau! 그게 뭐야? 수치스러운거야? 저 아름다움의 관련 문서에 대한 링크를 추가 할 수 있습니까? – joaquin

+0

그것은 numpy 관용구 (또한 "matlab-ism")입니다. http://www.scipy.org/Tentative_NumPy_Tutorial#head-d55e594d46b4f347c20efe1b4c65c92779f06268 (링크는 문서가 아닌 튜토리얼에 대한 것입니다. 문서의 관련 섹션은 numpy에 대해 더 많이 알고 있다고 가정합니다.) numpy 배열에 대한 논리 연산은 boolean을 반환합니다. 배열. 이것들은 (다른 것들 중에서) 동일한 모양의 빈약 한 배열을 색인하는 데 사용될 수 있습니다. –

관련 문제