2016-10-28 8 views
1

Matplotlib의 수십 년을 다루는 로그 로그 플롯을 만들려고합니다. 그러나 나에게 반환 된 기본 x 축 눈금은 한 번에 20 년을 커버하므로 그 사이에 4 개의 눈금이 표시되므로 이상적입니다. 내가 사용하고있는 코드는 다음Matplotlib : 로그 플롯의 이상한 20 년 축 틱

rc('text', usetex=True) 
f,ax=plt.subplots(figsize=(10,8)) 
plt.xscale('log') 
plt.yscale('log') 
plt.ylim([1e26,1e29]) 
plt.xlim([20,1e10]) 
plt.xlabel(r'x',fontsize=22) 
plt.ylabel(r'y',fontsize=22) 
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in') 
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in') 
ax.yaxis.set_tick_params(right='on',which='both') 
ax.xaxis.set_tick_params(top='on',which='both') 
plt.savefig('example.pdf',bbox_inches='tight') 

이미지가 나에게 돌아은 다음과 같습니다 : 당신이 볼 수 있듯이

enter image description here

는 주요 x 축 레이블 10^3에서 이동 반면에 주요 레이블 사이에는 4 개의 작은 x 축 레이블 만 있습니다. 저는 10 년마다 주요 라벨을 갖고 싶습니다. y 축과 마찬가지로, 각 10 년 사이에 표준 8 틱이 있습니다. 게다가 축이 너무 혼란스럽지 않게하기 위해 x- 축에 라벨을 붙이는 것이 이상적입니다. 즉, 10^3, 10^5, 10^7, 10^9가 현재와 같이 레이블이 지정되기를 원합니다. 나는 그 사이의 모든 수십 년 동안 major/minor tick을 확장하기를 원한다.

미리 감사드립니다. 또한 도움이된다면 matplotlib 버전 2.0.0을 사용하고 있습니다. 2.0.0에만있는 추가 기능을 사용하려면이 버전 (이전 버전 대신)을 사용해야합니다.

답변

1

v2에서는 matplotlib가 큰 범위에 걸쳐 로그 축에서 그려지는 틱/레이블 수를 줄이기 위해 변경된 것으로 보입니다. 아래 코드는 틱을 다시 추가하는 한 가지 방법을 보여줍니다. 이 코드

import pylab as plt 
import numpy as np 
from matplotlib.ticker import LogLocator 

plt.rc('text', usetex=True) 
f,ax=plt.subplots(figsize=(10,8)) 
plt.xscale('log') 
plt.yscale('log') 
plt.ylim([1e26,1e29]) 
plt.xlim([20,1e10]) 
plt.xlabel(r'x',fontsize=22) 
plt.ylabel(r'y',fontsize=22) 
plt.tick_params(axis='both', which='major', labelsize=22,length=9,direction='in') 
plt.tick_params(axis='both', which='minor', labelsize=22,length=5,direction='in') 
ax.yaxis.set_tick_params(right='on',which='both') 
ax.xaxis.set_tick_params(top='on',which='both') 

# manipulate x-axis ticks and labels 
ax.xaxis.set_major_locator(LogLocator(numticks=15)) #(1) 
ax.xaxis.set_minor_locator(LogLocator(numticks=15,subs=np.arange(2,10))) #(2) 
for label in ax.xaxis.get_ticklabels()[::2]: 
    label.set_visible(False) #(3) 

plt.savefig('example.pdf',bbox_inches='tight') 

나는 10 년마다가, 8 작은 모든 주요 틱 주요 틱, 및 축 레이블 사이 틱 주요 틱을 구하십시오. 하지만 방금이 답변을 게시하기 위해 계정을 만들었으므로 해당 이미지를 공유 할만한 충분한 평판을 얻지 못했습니다. (.

각 줄에 대한 세부 정보 (위 코드의 번호 매기기 참조) :

  1. 플롯 축 미등록 이상 5 수십 (걸쳐있는 경우. 값 15 matplotlib/lib/matplotlib/ticker.py에서 소스 코드를 참조 V1의 임계 값이다. 허용 눈금의 최대 수를 증가 시키지만, 소스 코드를 참조), matplotlib v2는 기본적으로 (2,4,6,8)에서만 작은 눈금을 그리는 데 사용됩니다.이 값은 작은 눈금의 전체 범위를 지정합니다
  2. 다른 모든 x 축 레이블을 끕니다 (예 : this answer.