2016-10-28 89 views
1

我正在試圖製作一個包含Matplotlib中幾十年的對數座標圖。但是,返回給我的默認x軸刻度並不理想,因爲它們一次只能覆蓋二十年,其間只有四個刻度線。我使用的代碼如下:Matplotlib:對數座標圖中奇怪的雙十年軸座標系

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去到10^5等。另一方面,主標籤之間只有4個小的x軸標籤。我希望每十年都有一個重要的標籤,就像Y軸上的標籤一樣,每十年之間標準的8個標籤。此外,我希望X軸上的標籤保持原樣,以便軸線不會太雜亂。也就是說,我要把10^3,10^5,10^7,10^9貼上現在的標籤。我只想將主要/次要蜱延伸到兩者之間的所有幾十年。

在此先感謝。另外,如果它有幫助,我使用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') 

我獲得主刻度每十年,8次要主刻度,以及用於每一個其他主刻度軸標籤之間蜱英寸但是,由於我剛剛創建了一個帳戶來發布此答案,因此我沒有足夠的信譽來分享相應的圖像:(.

每個標記行上的一些詳細信息(請參閱上面代碼中的編號註釋):

  1. 增加允許刻度線的最大數目。該值15是從V1的閾值時,看到的源代碼在matplotlib/lib/matplotlib/ticker.py
  2. 當情節軸跨越多於5個十年(無證,但見源代碼),matplotlib v2默認僅在(2,4,6,8)處繪製次要刻度線,這指定了所有次要刻度線的範圍
  3. 關閉所有其他x軸標籤,請參閱this answer