今天是第一次寫踩坑日記系列,這個(gè)系列用來記錄在Python和R學(xué)習(xí)過程中遇到的問題和結(jié)果。今天介紹的是使用Python的matplotlib庫繪制兩個(gè)y軸圖的一些基本用法與踩坑行為。希望可以幫助到大家,也希望大家可以給出建議,歡迎留言交流。
Matplotlib介紹
Matplotlib是Python數(shù)據(jù)分析中常用的可視化工具,也是其他高級(jí)繪圖接口(如seaborn, HoloViews, ggplot等)和專業(yè)繪圖工具(如Cartopy)的基礎(chǔ)。Matplotlib可以創(chuàng)建出版質(zhì)量的圖形,制作交互式的圖形,自定義視覺風(fēng)格和布局,導(dǎo)出到多種文件格式,嵌入在JupyterLab和圖形用戶界面中。更多探索內(nèi)容請(qǐng)查看Matplotlib官網(wǎng)或Matplotlib中文網(wǎng)。
安裝
pip install matplotlib
繪圖元素
以下是 Matplotlib 圖形的組件,來自于Matplotlib官網(wǎng),詳細(xì)使用方法查看快速入門指南 — Matplotlib 3.7.1 文檔。
設(shè)置標(biāo)題或軸名稱等文本標(biāo)簽內(nèi)容時(shí),如果含有中文字符出現(xiàn)亂碼的情況,需要添加以下代碼,如果仍然無法解決,可以嘗試將SimHei
字體改為FangSong
等其他字體。
plt.rcParams['font.sans-serif']=['SimHei'] # 用來設(shè)置字體樣式以正常顯示中文標(biāo)簽(黑體)
如果數(shù)字為負(fù)數(shù),也可能會(huì)亂碼,解決方法為:
plt.rcParams['axes.unicode_minus']=False
Matplotlib提供了多種圖形,包括基本的柱狀圖、折線圖、散點(diǎn)圖、箱線圖、散點(diǎn)圖、餅圖等,還提供了極坐標(biāo)圖、3D圖形等高級(jí)的可視化圖形(如果不想看官方文檔,可以查看知乎上的一篇文章學(xué)習(xí)繪制以上圖形的基本方法),可以通過以上參數(shù)對(duì)圖像細(xì)節(jié)進(jìn)行修改,并且可以對(duì)各種圖形進(jìn)行組合。
雙y軸圖
畫單y軸圖
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例數(shù)據(jù)
x = np.arange(10)
y = np.random.randint(0,20,10)
# 繪制折線圖,設(shè)置顏色
plt.plot(x,y,color='blue')
# 設(shè)置x軸和y軸的標(biāo)簽,指明坐標(biāo)含義
plt.xlabel('x軸', fontdict={'size': 16})
plt.ylabel('y軸', fontdict={'size': 16})
#設(shè)置圖標(biāo)題
plt.title('折線圖')
# 設(shè)置中文顯示
plt.rcParams['font.sans-serif']=['SimHei']
#展示圖片
plt.show()

#畫柱狀圖
plt.bar(x,y,color='blue')#只要將以上代碼中的`plot`改為`bar`

雙y軸折線圖
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例數(shù)據(jù)
x = np.arange(10)
y1 = np.random.randint(10, size=10)
y2 = np.random.randint(10, size=10)
# 創(chuàng)建一個(gè)圖形和兩個(gè)y軸
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
#繪制折線圖
line1 = ax1.plot(x, y1,label='y1軸', color='royalblue', marker='o', ls='-.')
line2 = ax2.plot(x, y2, label='y2軸', color='tomato', marker=None, ls='--')
# 設(shè)置x軸和y軸的標(biāo)簽,指明坐標(biāo)含義
ax1.set_xlabel('x軸', fontdict={'size': 16})
ax1.set_ylabel('y1軸',fontdict={'size': 16})
ax2.set_ylabel('y2軸',fontdict={'size': 16})
#添加圖表題
plt.title('雙y軸折線圖')
#添加圖例
plt.legend()
# 設(shè)置中文顯示
plt.rcParams['font.sans-serif']=['SimHei']
#展示圖片
plt.show()

解決圖例 通過以上方式設(shè)置的圖例沒有y1軸
,并且也沒有出現(xiàn)報(bào)錯(cuò)信息,說明兩個(gè)圖例都顯示出來的,很有可能就是y2軸
的圖例將y1軸
圖例覆蓋了。通過將兩軸的圖例分開顯示后證明確實(shí)是覆蓋掉了
#將`plt.legend()`改為以下代碼
ax1.legend(loc='upper right')
ax2.legend(loc='upper left')

但是兩個(gè)圖例分開顯示也太丑了,還是希望可以將圖例組合到一起
lines = line1 + line2
labels = [h.get_label() for h in lines]
plt.legend(lines, labels, loc='upper right')

設(shè)置軸 感覺這樣看著有點(diǎn)不方便,如果把軸和線的顏色一致可能要好看一些
#設(shè)置軸標(biāo)簽顏色
ax1.tick_params('y', colors='royalblue')
ax2.tick_params('y', colors='tomato')
#設(shè)置軸顏色
ax1.spines['left'].set_color('royalblue')
ax2.spines['left'].set_color('royalblue')
ax1.spines['right'].set_color('tomato')
ax2.spines['right'].set_color('tomato')

兩個(gè)y軸的顏色改變確實(shí)要好看一點(diǎn),但是上軸線有點(diǎn)突兀,把它去掉
ax1.spines['top'].set_visible(False)
ax2.spines['top'].set_visible(False)

柱狀圖+折線圖
把上邊的y2改為柱狀圖,繪制柱狀圖與折線圖雙y軸圖
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例數(shù)據(jù)
x = np.arange(10)
y1 = np.random.randint(10, size=10)
y2 = np.random.randint(10, size=10)
# 創(chuàng)建一個(gè)圖形和兩個(gè)y軸
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
#繪制圖形
bar = ax1.bar(x, y1, label='y1軸', color='tomato', width=0.4)
line = ax2.plot(x, y2,label='y2軸', color='royalblue', marker='o', ls='-.')
# 設(shè)置x軸和y軸的標(biāo)簽,指明坐標(biāo)含義
ax1.set_xlabel('x軸', fontdict={'size': 16})
ax1.set_ylabel('y1軸',fontdict={'size': 16})
ax2.set_ylabel('y2軸',fontdict={'size': 16})
#添加圖表題
plt.title('雙y軸折線圖')
#添加圖例
lines = line + bar
labels = [h.get_label() for h in lines]
plt.legend(lines, labels, loc='upper right')
#設(shè)置軸標(biāo)簽顏色
ax1.tick_params('y', colors='royalblue')
ax2.tick_params('y', colors='tomato')
#設(shè)置軸顏色
ax1.spines['left'].set_color('royalblue')
ax2.spines['left'].set_color('royalblue')
ax1.spines['right'].set_color('tomato')
ax2.spines['right'].set_color('tomato')
#去掉上軸線
ax1.spines['top'].set_visible(False)
ax2.spines['top'].set_visible(False)
# 設(shè)置中文顯示
plt.rcParams['font.sans-serif']=['SimHei']
#展示圖片
plt.show()
哎嗨,報(bào)錯(cuò)了。matplotlib柱狀圖的返回值是一個(gè)BarContainer元組對(duì)象,而折線圖的返回值是一個(gè)Line2D列表對(duì)象。
使用matplotlib.pyplot.plot()函數(shù)來繪制一條折線,并將其返回值賦給一個(gè)變量,需要注意plot()函數(shù)返回的是一個(gè)包含一個(gè)Line2D對(duì)象的列表,而不是一個(gè)Line2D對(duì)象本身。所以,你需要在變量后面加上一個(gè)逗號(hào),或者在使用get_label()方法時(shí)指定列表的索引為0,才能正確地獲取Line2D對(duì)象的標(biāo)簽。所以將以上#繪制圖形
模塊改為
#繪制圖形
bar = ax1.bar(x, y1, label='y1軸', color='tomato', width=0.4)
line, = ax2.plot(x, y2,label='y2軸', color='royalblue', marker='o', ls='-.')

好了,今天的踩坑日記就到這里了,對(duì)于圖的其它修改細(xì)節(jié),大家可以自己嘗試一下,多試試總能發(fā)現(xiàn)不同的坑。文章來源:http://www.zghlxwxcb.cn/news/detail-613933.html
本文由 mdnice 多平臺(tái)發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-613933.html
到了這里,關(guān)于Python使用Matplotlib庫繪制雙y軸圖形(柱狀圖+折線圖)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!