2014-02-24 4 views
2

원래 X 축 틱과 동일한 위치 (틱 레이블은 다를 수 있음)의 틱이있는 상단 X 축을 갖고 싶습니다. 그것은 할 수있을만큼 쉬운 것 같다, 그러나 나는 아래의 코드가 작동하지 않는 이유는 확실하지 않다 :Matplotlib이 추가 축의 잘못된 위치에 표시됩니다.

출력은 다음과 같습니다
import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 

X = np.linspace(11,80,1000) 
Y = 2*np.sin(X)*np.exp(-X/20.) 

ax1.plot(X,Y) 
ax2 = ax1.twiny() 

old_ticks = ax1.get_xticks() 
ax2.set_xticks(old_ticks) 

plt.show() 

: 명확하게, 상단 축에 진드기가의 동일한 위치에 있지 아래쪽 틱 (즉, 위쪽 축에는 7 개 틱이 있고 아래쪽은 6 개 틱)입니다.

왜 이렇게됩니까?

Offset ticks on the second x axis

편집 : (아래 제안) xlim 설정은 초기 음모에 작동하지만, 하나가 다른 지역으로 확대하지 않을 때. 확대/축소시에 ax1에있는 것과 동일한 위치에 ax2의 틱을 추가했지만이 기능이 작동하지 않는 것처럼 콜백 함수를 추가했습니다.

또한 twiny을 사용하는 이유는 결국 ax2의 표시된 틱 값이 ax1 틱 값에 비선형 방식으로 의존하기 때문입니다. 진드기가 축의 같은 위치에 있도록하고 싶습니다. 수입 NumPy와 PLT로 NP 수입 matplotlib.pyplot로

fig = plt.figure() 
ax1 = fig.add_subplot(111) 

X = np.linspace(11,80,1000) 
Y = 2*np.sin(X)*np.exp(-X/20.) 

ax1.plot(X,Y) 
ax2 = ax1.twiny() 

ax2.set_xlim(ax1.get_xlim()) 
ax2.set_xticks(ax1.get_xticks()) 

def on_xlim_changed(ax1): 
    ax2.set_xlim(ax1.get_xlim()) 
    ax2.set_xticks(ax1.get_xticks()) 

ax1.callbacks.connect('xlim_changed',on_xlim_changed) 

plt.show() 

답변

2

는 시도 : 당신은 그냥 상단에 표시 할 틱해야하는 경우

ax2.set_xlim(ax1.get_xlim()) 

또한, 당신은 twiny 축이 필요하지 않습니다 당신은 Locator 기능을 사용한다

ax1.xaxis.set_ticks_position('both') 
+1

이것은 처음에는 플롯을 표시 할 때만 작동하지만 플롯에서 다른 영역으로 확대 할 때는 작동하지 않는 것처럼 보입니다. 내가'twiny '를 사용하고자하는 이유는 똑같은 위치 (아래 축처럼)에 진드기가 있기를 원하기 때문입니다. 그러나 진드기 라벨은 다를 것입니다. 위의 "확장"설명을 포함하도록 위의 질문을 편집했습니다. –

0

당신은 간단하게 할 수 있습니다

import matplotlib.ticker as mticks 

N = 5 
ax1.get_xaxis().set_major_locator(mticks.LinearLocator(numticks=N)) 
ax2.get_xaxis().set_major_locator(mticks.LinearLocator(numticks=hN)) 

(doc) N 균등 한 간격의 틱을 축에 넣습니다.

Formatter은 라벨 서식을 처리합니다.

매우 이상한 표정 레이블에 기댈 수 있습니다. 위치가 점프하는 이유는 기본 위치 지정자 인 AutoLocator이 '좋은'위치 (정수, 배수 등)에 틱을 넣으므로 '1.52547841082'와 같은 눈금 레이블이 표시되지 않기 때문입니다.

관련 문제