python 坐标轴刻度_给妹子讲python-S02E08坐标轴与主次刻度
微信公眾號(hào): python數(shù)據(jù)科學(xué)家
【要點(diǎn)搶先看】
1.剖析plt和坐標(biāo)軸對(duì)象ax的關(guān)系
2.主刻度與次刻度的概念
3.格式生成器與定位器的概念
4.數(shù)值型主次刻度與自定義格式生成器函數(shù)舉例
5.日期型主次刻度舉例
這一集,我們專門來談?wù)勛鴺?biāo)軸的有關(guān)內(nèi)容,先看以下兩段代碼,他們實(shí)現(xiàn)的是同樣的功能:繪制正余弦兩個(gè)子圖:
代碼一:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,1000)
plt.subplot(2, 1, 1)
plt.plot(x, np.sin(x)) #用plt繪制第一個(gè)子圖
plt.subplot(2,1,2)
plt.plot(x,np.cos(x)) #用plt繪制第二個(gè)子圖
plt.show()
代碼二:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,1000)
fig, ax = plt.subplots(2,1)
ax[0].plot(x, np.sin(x)) #用對(duì)應(yīng)的坐標(biāo)軸對(duì)象畫第一個(gè)子圖
ax[1].plot(x, np.cos(x)) #用對(duì)應(yīng)的坐標(biāo)軸對(duì)象畫第二個(gè)子圖
plt.show()
可以看出,這兩段代碼所達(dá)到的效果是一樣的。代碼段一采用的是MATLAB風(fēng)格的接口,這是由于Matplotlib最初是作為MATLAB替代品的歷史緣故。MATLAB風(fēng)格的工具位于pyplot 即plt接口中,因此我們可以采用plt.plot函數(shù)來進(jìn)行繪圖。這種接口最重要的特征就是“有狀態(tài)”:他表征當(dāng)前所位于的子圖狀態(tài),并持續(xù)跟蹤當(dāng)前的圖形和坐標(biāo)軸。并可以通過plt.gcf()獲取當(dāng)前的活動(dòng)Figure對(duì)象,利用plt.gca()獲取當(dāng)前活動(dòng)的axes坐標(biāo)軸對(duì)象。
而代碼段二所采用的是完全不同的第二種模式,即面向?qū)ο蠼涌?#xff0c;他在繪圖的過程之中不再受到當(dāng)前所謂“活動(dòng)”圖形及坐標(biāo)軸的限制,因?yàn)樗淮涡跃蛷膕ubplots函數(shù)中獲取了表征所有坐標(biāo)軸的ax數(shù)組和Figure對(duì)象。
補(bǔ)充一點(diǎn),坐標(biāo)軸對(duì)象ax包含了橫軸、縱軸所包圍的區(qū)域內(nèi)的一切(各坐標(biāo)軸、刻度、標(biāo)簽、圖形等)
我最后來說說plt和ax二者的聯(lián)系,plt的絕大多數(shù)方法都有ax的對(duì)應(yīng)版本,有的一模一樣,有的稍作改變:
plt.plot() = ax.plot()
plt.legend() = ax.legend()
plt.xlabel()/ylabel()/xlim()/ylim()/title() =
ax.setxlabel()/setylabel()/setxlim()/set_ylim()/set_title()
當(dāng)然,如果用ax來設(shè)置這些參數(shù)的話,可以放在一個(gè)函數(shù)中,用多個(gè)關(guān)鍵字進(jìn)行表征和設(shè)置
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,1000)
ax = plt.axes()
ax.plot(x,np.sin(x))
ax.set(xlim=(0,10), ylim=(-2,2), xlabel='x', ylabel='sin(x)',title='plot sin(x)')
plt.show()
值得一提的是,在代碼段一中我們還可以通過ax = plt.subplot(2, 1, 1)或ax = plt.gca()這兩種方法來獲得當(dāng)前的坐標(biāo)軸對(duì)象ax。
強(qiáng)化了坐標(biāo)軸ax的概念之后,我們?cè)龠M(jìn)入今天另一個(gè)重要的話題,坐標(biāo)軸的主次刻度。
每一個(gè)坐標(biāo)軸都有主要刻度線與次要刻度線。主要刻度更大更顯著,而次要刻度往往更小。主刻度都顯示為一個(gè)較大的刻度線和標(biāo)簽,而次要刻度都顯示為一個(gè)較小的刻度線,而不顯示標(biāo)簽。主次刻度這件事兒,大家想想我們用過的尺子就知道了,厘米的地方刻度要長而明顯,并且有數(shù)字標(biāo)識(shí),而毫米的地方刻度則要短,并且沒有數(shù)字標(biāo)識(shí)。這么做既能滿足刻度線的完整性,又能突出刻度標(biāo)識(shí)的重點(diǎn)。
我們先舉一個(gè)例子:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
fig = plt.figure()
xmajorLocator = MultipleLocator(20) # 將x主刻度標(biāo)簽設(shè)置為20的倍數(shù)
xmajorFormatter = FormatStrFormatter('%1.1f') # 設(shè)置x軸標(biāo)簽文本的格式
xminorLocator = MultipleLocator(5) # 將x軸次刻度標(biāo)簽設(shè)置為5的倍數(shù)
ymajorLocator = MultipleLocator(0.5) # 將y軸主刻度標(biāo)簽設(shè)置為0.5的倍數(shù)
ymajorFormatter = FormatStrFormatter('%1.1f') # 設(shè)置y軸標(biāo)簽文本的格式
yminorLocator = MultipleLocator(0.1) # 將此y軸次刻度標(biāo)簽設(shè)置為0.1的倍數(shù)
ax = plt.subplot(111)
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)
# 顯示次刻度標(biāo)簽的位置,沒有標(biāo)簽文本
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.grid(True, which='major') # x坐標(biāo)軸的網(wǎng)格使用主刻度
ax.yaxis.grid(True, which='minor') # y坐標(biāo)軸的網(wǎng)格使用次刻度
t = np.arange(100)
s = np.sin(0.1*np.pi*t)*np.exp(-t*0.01)
plt.plot(t,s,'--r*')
plt.show()
這個(gè)例子中,我們?cè)O(shè)置了主刻度線和次刻度線,其中x軸主刻度線是20的整數(shù)倍,并且標(biāo)明了刻度值,而次要刻度線是5的整數(shù)倍,省去了刻度值。y軸同理。
這里的核心是定位器和格式生成器兩個(gè)概念,我們先分別生成X軸的主定位器、主格式生成器,再生成X軸的次定位器(由于X軸次要坐標(biāo)沒有刻度值,所以省去了次要格式生成器)
然后再利用坐標(biāo)軸ax的xaxis.set_major_locator、xaxis.set_major_formatter和xaxis.set_minor_locator方法,分別對(duì)定位器和格式生成器進(jìn)行賦值。
總結(jié)一下:我們就是通過定義每個(gè)坐標(biāo)軸的locator和formatter對(duì)象,來完成刻線位置和標(biāo)簽這些屬性的設(shè)置。
我們?cè)倏匆粋€(gè)更復(fù)雜的例子
我們之前在繪制正余弦曲線圖的時(shí)候,橫坐標(biāo)的刻度值都是整數(shù)1,2,3等等,按道理來說我們更想以
為度量,那么我們仿照上面的例子來做:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
x = np.linspace(0, 3*np.pi, 100)
plt.plot(x,np.sin(x))
ax = plt.axes()
ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi/2))
ax.xaxis.set_minor_locator(plt.MultipleLocator(np.pi/4))
plt.show()
基本上是那么個(gè)意思,主刻度是π/2的倍數(shù),次刻度是π/4的刻度,但是用的是小數(shù)顯示,如果想更直觀的直接在圖上顯示π,怎么做?肯定還是要在格式生成器類上做文章,因?yàn)闆]有內(nèi)置的合適生成器滿足我們的要求,這里我們要用到自定義函數(shù)設(shè)置不同刻度的標(biāo)簽顯示。這里我們讀取實(shí)際的刻度值,用自定義函數(shù)將其轉(zhuǎn)換為相應(yīng)的π表達(dá)式。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
def format_func(value, tick_number):
N = int(np.round(2 * value / np.pi))
if N == 0:
return '0'
elif N == 1:
return r"$\pi/2$"
elif N == 2:
return r"$\pi$"
elif N % 2 > 0:
return r"${}\pi/2$".format(N)
else:
return r"${}\pi$".format(N//2)
x = np.linspace(0, 3*np.pi, 100)
plt.plot(x,np.sin(x))
ax = plt.axes()
ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi/2))
ax.xaxis.set_minor_locator(plt.MultipleLocator(np.pi/4))
ax.xaxis.set_major_formatter(plt.FuncFormatter(format_func))
ax.grid(True)
plt.show()
最后一部分,我們來談?wù)勅掌谛椭鞔慰潭取?/p>
一般來說,我們?cè)谔幚頃r(shí)間序列的數(shù)據(jù)時(shí),常常需要處理日期型X坐標(biāo)值,比如一整年的特定數(shù)據(jù),如果我們?cè)赬軸上將每天的刻度都標(biāo)識(shí)出來,一來太擁擠,二來也沒太大必要,一般我們會(huì)選取一些大的時(shí)間節(jié)點(diǎn)作為主刻度線,比如每月1日,或者固定的每周幾。我們分別舉兩個(gè)例子來實(shí)現(xiàn)這兩種情況
首先我們把每月1日設(shè)置為主刻度,可以利用MonthLocator作為定位器,DateFormatter作為格式生成器。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import datetime
fig = plt.figure()
start = datetime.datetime(2017, 1, 1)
end = datetime.datetime(2018, 1, 1)
delta = datetime.timedelta(days=1)
dates = mpl.dates.drange(start, end, delta) #生成matplotlib指定的日期橫軸
y = np.random.rand(len(dates))*0.4+0.5
ax = plt.subplot(111,ylim=(0,1))
ax.plot_date(dates,y,linestyle='-',marker='.')
ax.xaxis.set_major_locator(mpl.dates.MonthLocator())
ax.xaxis.set_major_formatter(mpl.dates.DateFormatter('%Y-%m'))
ax.grid(True)
fig.autofmt_xdate() # 自動(dòng)旋轉(zhuǎn)日期標(biāo)記,用以適應(yīng)橫軸空間
plt.show()
再補(bǔ)充強(qiáng)調(diào)幾個(gè)細(xì)節(jié),一是我們把日期格式只設(shè)置成了年月的形式,表示每個(gè)月的第一天。并且設(shè)置了自動(dòng)旋轉(zhuǎn)角度來適應(yīng)橫軸空間。同時(shí)我們發(fā)現(xiàn),我們需要mpl.dates.drange方法來專門形成matplotlib繪圖時(shí)可以識(shí)別的日期序列。
最后一個(gè)例子中我們以周為觀測(cè)單元,我們?cè)O(shè)置主刻度為每周一,次要刻度為每天。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import datetime
from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY
start = datetime.datetime(2017, 1, 1)
end = datetime.datetime(2017, 4, 1)
delta = datetime.timedelta(days=1)
dates = mpl.dates.drange(start, end, delta)
y = np.random.rand(len(dates))*0.4+0.5
fig,ax = plt.subplots(1)
ax.plot_date(dates,y,linestyle='-',marker='.')
mondays = WeekdayLocator(MONDAY)
alldays = DayLocator()
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
mondayFormatter = DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(mondayFormatter)
ax.grid(True)
fig.autofmt_xdate()
plt.show()
從代碼中我們可以看出,這里使用了周定位器WeekdayLocator,和日定位器DayLocator,主刻度格式設(shè)置為完整的年月日,其他的原理和之前都是一樣的。
【妹子說】很實(shí)用,刻度看起來確實(shí)是繪圖中不可忽視的一個(gè)重要細(xì)節(jié)!
總結(jié)
以上是生活随笔為你收集整理的python 坐标轴刻度_给妹子讲python-S02E08坐标轴与主次刻度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python伪装浏览器https_pyt
- 下一篇: python获取指定端口流量_利用pyt