日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 大数据量绘图_Matplotlib绘图遇到时间刻度就犯难?现在,一次性告诉你四种方法...

發布時間:2023/12/20 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 大数据量绘图_Matplotlib绘图遇到时间刻度就犯难?现在,一次性告诉你四种方法... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方"藍字"關注我們

Python大數據分析

記錄? ?分享? ?成長

添加微信號"

CNFeffery

"加入技術交流群

最近有小伙伴私信我關于matplotlib時間類型刻度的設置問題,第一感覺就是官網有好多例子介紹啊

?轉念一想,在實際應用中類似設置還挺多和好多小伙伴詢問,那么本期就就簡單介紹下Python-matplotlib「刻度(ticker)」 的使用方法,并結合具體例子講解時間刻度設置問題,使小伙伴們定制化刻度不再煩惱。本期推文只要涉及知識點如下:

Tick locators 刻度位置介紹

Tick formatters 刻度形式介紹

時間刻度的設置

位置(Locator)和形式 (Formatter)

Tick Locator

Tick Locator主要設置刻度位置,這在我的繪圖教程中主要是用來設置副刻度(minor),而Formatter則是主要設置刻度形式。Matplotlib對這兩者則有著多種用法,其中Locator的子類主要如下:

定位器

解釋說明

AutoLocator

自動定位器,多數繪圖的默認刻度線定位。

MaxNLocator

在最合適的位置找到帶有刻度的最大間隔數。

LinearLocator

從最小到最大之間的均勻刻度定位。

LogLocator

從最小到最大呈對數形式的刻度定位。

MultipleLocator

刻度和范圍是基數的倍數;整數或浮點數。(自定義刻度用較多的方法)。

FixedLocator

固定刻度定位。刻度位置是固定的。

IndexLocator

索引定位器。

NullLocator

空定位器。無刻度位置。

SymmetricalLogLocator

與符號規范一起使用的定位器;對于超出閾值的部分,其工作原理類似于LogLocator,如果在限制范圍內,則將其加0。

LogitLocator

用于logit縮放的刻度定位器。

OldAutoLocator

選擇一個MultipleLocator并動態重新分配它,以在導航期間進行智能打勾。(直接翻譯,感覺用的不多)。

AutoMinorLocator

軸為線性且主刻度線等距分布時,副刻度線定位器。將主要刻度間隔細分為指定數量的次要間隔,根據主要間隔默認為4或5。

看完是不是覺得小編啥都沒說,越看越糊涂?其實我也是。下面 我們就將每種刻度定位(Locator)可視化展現出來,有助于我們直接觀察。主要代碼如下:

//Filename?Locator.python

import?numpy?as?np

import?matplotlib.pyplot?as?plt

import?matplotlib.ticker?as?ticker

plt.rcParams['font.family']?=?"Times?New?Roman"

def?setup(ax,?title):

"""Set?up?common?parameters?for?the?Axes?in?the?example."""

#?only?show?the?bottom?spine

ax.yaxis.set_major_locator(ticker.NullLocator())

ax.spines['right'].set_color('none')

ax.spines['left'].set_color('none')

ax.spines['top'].set_color('none')

ax.xaxis.set_ticks_position('bottom')

ax.tick_params(which='major',?width=1.00,?length=5)

ax.tick_params(which='minor',?width=0.75,?length=2.5)

ax.set_xlim(0,?5)

ax.set_ylim(0,?1)

ax.text(0.0,?0.2,?title,?transform=ax.transAxes,

fontsize=14,?fontname='Monospace',?color='tab:blue')

fig,?axs?=?plt.subplots(8,?1,?figsize=(8,?6),dpi=200)

#?Null?Locator

setup(axs[0],?title="NullLocator()")

axs[0].xaxis.set_major_locator(ticker.NullLocator())

axs[0].xaxis.set_minor_locator(ticker.NullLocator())

#?Multiple?Locator

setup(axs[1],?title="MultipleLocator(0.5)")

axs[1].xaxis.set_major_locator(ticker.MultipleLocator(0.5))

axs[1].xaxis.set_minor_locator(ticker.MultipleLocator(0.1))

#?Fixed?Locator

setup(axs[2],?title="FixedLocator([0,?1,?5])")

axs[2].xaxis.set_major_locator(ticker.FixedLocator([0,?1,?5]))

axs[2].xaxis.set_minor_locator(ticker.FixedLocator(np.linspace(0.2,?0.8,?4)))

#?Linear?Locator

setup(axs[3],?title="LinearLocator(numticks=3)")

axs[3].xaxis.set_major_locator(ticker.LinearLocator(3))

axs[3].xaxis.set_minor_locator(ticker.LinearLocator(31))

#?Index?Locator

setup(axs[4],?title="IndexLocator(base=0.5,?offset=0.25)")

axs[4].plot(range(0,?5),?[0]*5,?color='white')

axs[4].xaxis.set_major_locator(ticker.IndexLocator(base=0.5,?offset=0.25))

#?Auto?Locator

setup(axs[5],?title="AutoLocator()")

axs[5].xaxis.set_major_locator(ticker.AutoLocator())

axs[5].xaxis.set_minor_locator(ticker.AutoMinorLocator())

#?MaxN?Locator

setup(axs[6],?title="MaxNLocator(n=4)")

axs[6].xaxis.set_major_locator(ticker.MaxNLocator(4))

axs[6].xaxis.set_minor_locator(ticker.MaxNLocator(40))

#?Log?Locator

setup(axs[7],?title="LogLocator(base=10,?numticks=15)")

axs[7].set_xlim(10**3,?10**10)

axs[7].set_xscale('log')

axs[7].xaxis.set_major_locator(ticker.LogLocator(base=10,?numticks=15))

plt.tight_layout()

plt.savefig(r'F:\DataCharm\學術圖表繪制\Python-matplotlib\matplotlib_locators',width=6,height=4,

dpi=900,bbox_inches='tight')

plt.show()

可視化結果如下:

圖中紅框標出的為 Tick locators 較常用的的幾種形式。

Tick formatters

Tick formatters 設置刻度標簽形式,主要對繪圖刻度標簽定制化需求時,matplotlib 可支持修改的刻度標簽形式如下:

定位器

解釋說明

NullFormatter

刻度線上沒有標簽。

IndexFormatter

從標簽列表中設置刻度標簽。

FixedFormatter

手動設置標簽字符串。

FuncFormatter

用戶定義的功能設置標簽。

StrMethodFormatter

使用字符串方法設置刻度標簽。

FormatStrFormatter

使用舊式的sprintf格式字符串。

ScalarFormatter

標量的默認格式:自動選擇格式字符串。

LogFormatter

Log對數形式的刻度標簽。

LogFormatterExponent

使用exponent=log_base(value)形式的刻度標簽。

LogFormatterMathtext

使用Math文本使用exponent = log_base(value)格式化對數軸的值。

LogitFormatter

概率格式器。

PercentFormatter

將標簽格式化為百分比。

還是老樣子,我們可視化展示來看,這樣就對每一個刻度標簽形式有明確的理解,代碼如下:

//?filename?Tick?formatters.python

import?matplotlib.pyplot?as?plt

from?matplotlib?import?ticker

def?setup(ax,?title):

"""Set?up?common?parameters?for?the?Axes?in?the?example."""

#?only?show?the?bottom?spine

ax.yaxis.set_major_locator(ticker.NullLocator())

ax.spines['right'].set_color('none')

ax.spines['left'].set_color('none')

ax.spines['top'].set_color('none')

#?define?tick?positions

ax.xaxis.set_major_locator(ticker.MultipleLocator(1.00))

ax.xaxis.set_minor_locator(ticker.MultipleLocator(0.25))

ax.xaxis.set_ticks_position('bottom')

ax.tick_params(which='major',?width=1.00,?length=5)

ax.tick_params(which='minor',?width=0.75,?length=2.5,?labelsize=10)

ax.set_xlim(0,?5)

ax.set_ylim(0,?1)

ax.text(0.0,?0.2,?title,?transform=ax.transAxes,

fontsize=14,?fontname='Monospace',?color='tab:blue')

fig0,?axs0?=?plt.subplots(2,?1,?figsize=(8,?2))

fig0.suptitle('Simple?Formatting')

setup(axs0[0],?title="'{x}?km'")

axs0[0].xaxis.set_major_formatter('{x}?km')

setup(axs0[1],?title="lambda?x,?pos:?str(x-5)")

axs0[1].xaxis.set_major_formatter(lambda?x,?pos:?str(x-5))

fig0.tight_layout()

#?The?remaining?examples?use?Formatter?objects.

fig1,?axs1?=?plt.subplots(7,?1,?figsize=(8,?6))

fig1.suptitle('Formatter?Object?Formatting')

#?Null?formatter

setup(axs1[0],?title="NullFormatter()")

axs1[0].xaxis.set_major_formatter(ticker.NullFormatter())

#?StrMethod?formatter

setup(axs1[1],?title="StrMethodFormatter('{x:.3f}')")

axs1[1].xaxis.set_major_formatter(ticker.StrMethodFormatter("{x:.3f}"))

#?FuncFormatter?can?be?used?as?a?decorator

@ticker.FuncFormatter

def?major_formatter(x,?pos):

return?f'[{x:.2f}]'

setup(axs1[2],?title='FuncFormatter("[{:.2f}]".format')

axs1[2].xaxis.set_major_formatter(major_formatter)

#?Fixed?formatter

setup(axs1[3],?title="FixedFormatter(['A',?'B',?'C',?...])")

#?FixedFormatter?should?only?be?used?together?with?FixedLocator.

#?Otherwise,?one?cannot?be?sure?where?the?labels?will?end?up.

positions?=?[0,?1,?2,?3,?4,?5]

labels?=?['A',?'B',?'C',?'D',?'E',?'F']

axs1[3].xaxis.set_major_locator(ticker.FixedLocator(positions))

axs1[3].xaxis.set_major_formatter(ticker.FixedFormatter(labels))

#?Scalar?formatter

setup(axs1[4],?title="ScalarFormatter()")

axs1[4].xaxis.set_major_formatter(ticker.ScalarFormatter(useMathText=True))

#?FormatStr?formatter

setup(axs1[5],?title="FormatStrFormatter('#%d')")

axs1[5].xaxis.set_major_formatter(ticker.FormatStrFormatter("#%d"))

#?Percent?formatter

setup(axs1[6],?title="PercentFormatter(xmax=5)")

axs1[6].xaxis.set_major_formatter(ticker.PercentFormatter(xmax=5))

fig1.tight_layout()

plt.show()

結果如下:

以上就是對matplotlib 的刻度位置和刻度標簽形式的介紹,大家也只需了解一兩個常用的即可,其他用時再到matplotlib查找即可。下面我們將通過幾個例子講解刻度中用的最多的「時間刻度形式」的設置。

時間刻度形式

默認時間格式

這里我們使用自己生成的數據進行繪制,詳細代碼如下:

//filename?time_tick01.python

//@by?DataCharm

import?matplotlib.pyplot?as?plt

import?matplotlib.dates?as?mdates

from?datetime?import?datetime

plt.rcParams['font.family']?=?'Times?New?Roman'

dates=[20200601,20200602,20200603,20200604,20200605,20200606,20200607,20200608]

sales=[20,30,40,60,50,70,40,30]

#將dates改成日期格式

x=?[datetime.strptime(str(d),?'%Y%m%d').date()?for?d?in?dates]

#繪圖

fig,ax?=?plt.subplots(figsize=(4,2.5),dpi=200)

ax.plot(x,sales,lw=2,color='#24C8B0',marker='o',ms=6,?mec='#FD6174',mew=1.5,?mfc='w')

#設置時間刻度軸旋轉角度:使用ax.tick_params

#?ax.tick_params(axis='x',direction='in',labelrotation=40,labelsize=8,pad=5)?#選擇x軸

#?ax.tick_params(axis='y',direction='in',labelsize=8,pad=5)

#或者如下設置

for?label?in?ax.get_xticklabels():

label.set_rotation(40)

label.set_horizontalalignment('right')

ax.text(.85,.05,'\nVisualization?by?DataCharm',transform?=?ax.transAxes,

ha='center',?va='center',fontsize?=?4,color='black',fontweight='bold',family='Roboto?Mono')

#ax.tick_params(pad=5)

plt.savefig("F:\DataCharm\學術圖表繪制\Python-matplotlib\matplotlib_time_ticks_set01.png",width=8,height=5,dpi=900,bbox_inches='tight')

#顯示圖像

plt.show()

可視化結果如下:

這里我們可以發現,雖然我們設置了旋轉角度(具體設置方式看繪圖代碼),但也不可避免導致影響美觀。接下來我們使用半自動方式定制時間刻度形式。

使用DayLocator、HourLocator等時間刻度定位器

具體代碼如下:

//filename?time_tick02.python

//@by?DataCharm

import?matplotlib.pyplot?as?plt

import?matplotlib.dates?as?mdates

from?datetime?import?datetime

dates=[20200601,20200602,20200603,20200604,20200605,20200606,20200607,20200608]

sales=[20,30,40,60,50,70,40,30]

#將dates改成日期格式

x=?[datetime.strptime(str(d),?'%Y%m%d').date()?for?d?in?dates]

#繪圖

fig,ax?=?plt.subplots(figsize=(4,2.5),dpi=200)

ax.plot(x,sales,lw=2,color='#24C8B0',marker='o',ms=6,?mec='#FD6174',mew=1.5,?mfc='w')

#設置x軸主刻度格式

day?=??mdates.DayLocator(interval=2)?#主刻度為天,間隔2天

ax.xaxis.set_major_locator(day)?#設置主刻度

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

#設置副刻度格式

hoursLoc?=?mdates.HourLocator(interval=20)?#為20小時為1副刻度

ax.xaxis.set_minor_locator(hoursLoc)

ax.xaxis.set_minor_formatter(mdates.DateFormatter('%H'))

#設置主刻度旋轉角度和刻度label刻度間的距離pad

ax.tick_params(which='major',axis='x',labelrotation=10,labelsize=9,length=5,pad=10)

ax.tick_params(which='minor',axis='x',labelsize=8,length=3)

ax.tick_params(axis='y',labelsize=9,length=3,direction='in')

ax.text(.85,.05,'\nVisualization?by?DataCharm',transform?=?ax.transAxes,

ha='center',?va='center',fontsize?=?4,color='black',fontweight='bold',family='Roboto?Mono')

plt.savefig("F:\DataCharm\學術圖表繪制\Python-matplotlib\matplotlib_time_ticks_set03.png",width=8,height=5,dpi=900,

bbox_inches='tight')

#顯示圖像

plt.show()

可視化結果如下:

可以發現(如圖中紅色圓圈所示),我們分別設置了主副刻度形式且設置了時間間隔。接下來我們看一個一鍵設置時間刻度形式的方式。

使用ConciseDateFormatter 時間刻度形式

繪圖代碼如下:

//filename?time_tick_ConciseDate.python

//@by?DataCharm

import?datetime

import?matplotlib.pyplot?as?plt

import?matplotlib.dates?as?mdates

import?numpy?as?np

dates=[20200601,20200602,20200603,20200604,20200605,20200606,20200607,20200608]

sales=[20,30,40,60,50,70,40,30]

#將dates改成日期格式

x=?[datetime.strptime(str(d),?'%Y%m%d').date()?for?d?in?dates]

fig,ax?=?plt.subplots(figsize=(4,2.5),dpi=200)

locator?=?mdates.AutoDateLocator(minticks=2,?maxticks=7)

formatter?=?mdates.ConciseDateFormatter(locator)

ax.plot(x,sales,lw=2,color='#24C8B0',marker='o',ms=6,?mec='#FD6174',mew=1.5,?mfc='w')

ax.xaxis.set_major_locator(locator)

ax.xaxis.set_major_formatter(formatter)

ax.text(.85,.05,'\nVisualization?by?DataCharm',transform?=?ax.transAxes,

ha='center',?va='center',fontsize?=?4,color='black',fontweight='bold',family='Roboto?Mono')

plt.savefig("F:\DataCharm\學術圖表繪制\Python-matplotlib\matplotlib_time_ticks_set02.png",width=8,height=5,dpi=900,bbox_inches='tight')

plt.show()

可以看出(如下圖紅色圓圈所示),這種方法可以完美解決時間刻度擁擠的現象,而且在對多時間或者一天內多小時也能夠完美解決。

直接更改刻度標簽名稱(tickslabel)

最后這種方法就比較簡單粗暴了,我們直接使用ax.set_xticklabels() 命名刻度標簽。代碼如下:

//filename?time_tick_04.python

//@by?DataCharm

import?matplotlib.pyplot?as?plt

import?matplotlib.dates?as?mdates

from?datetime?import?datetime

dates=[20200601,20200602,20200603,20200604,20200605,20200606,20200607,20200608]

sales=[20,30,40,60,50,70,40,30]

date_label?=?['2020-0601','2020-06-02','20200603','2020-604','2020605','20200606','2020-0607',

'2020-0608']

#將dates改成日期格式

x=?[datetime.strptime(str(d),?'%Y%m%d').date()?for?d?in?dates]

#繪圖

fig,ax?=?plt.subplots(figsize=(4,2.5),dpi=200)

ax.plot(x,sales,lw=2,color='#24C8B0',marker='o',ms=6,?mec='#FD6174',mew=1.5,?mfc='w')

#自定義刻度label

ax.set_xticklabels(date_label)

#設置主刻度旋轉角度和刻度label于刻度間的距離pad

ax.tick_params(axis='x',labelrotation=15,labelsize=8,length=5,pad=5)

ax.tick_params(axis='y',labelsize=9,length=3,direction='in')

ax.text(.85,.05,'\nVisualization?by?DataCharm',transform?=?ax.transAxes,

ha='center',?va='center',fontsize?=?4,color='black',fontweight='bold',family='Roboto?Mono')

plt.savefig("F:\DataCharm\學術圖表繪制\Python-matplotlib\matplotlib_time_ticks_set04.png",width=8,height=5,dpi=900,

bbox_inches='tight')

#顯示圖像

plt.show()

結果如下(圖中紅色圓圈內),這里我隨意定義刻度labels形式。

總結

本篇推文首先簡單介紹了Python-matplotlib刻度(ticker) 設置位置和形式,然后具體介紹了時間刻度設置的幾種方法,希望能夠給大家解決時間刻度設置帶來靈感。就本人繪圖而言,matplotlib時間刻度設置還是采用ConciseDateFormatter方法最為方便,當然,如果定制化需求較高,大家也可以采用直接設置刻度的方法。

加入我們的知識星球【Python大數據分析】

愛上數據分析!

· 往期精選 ·

Python大數據分析

data creates?value

掃碼關注我們

總結

以上是生活随笔為你收集整理的python 大数据量绘图_Matplotlib绘图遇到时间刻度就犯难?现在,一次性告诉你四种方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。