文章目錄
- 1. 畫單圖、并列圖、以及調整圖的大小
- 1.1. 生成圖像
- 1.2. 圖中含有中文
- 1.3. 設置大標題
- 1.4. 生成子圖
- 1.5. 網格劃分整個圖像,同時展示不同大小的圖
- 1.6. 畫折線圖
- 1.7. 畫柱狀圖
- 1.8. 設置子圖的標題
- 1.9. 設置坐標軸的label
- 1.10. 設置以及修改坐標軸的刻度(ticks)
- 1.11. 設置圖例
- 1.12. 保存以及顯示圖像
- 2. 整體代碼以及結果的展示
- 2.1. 結果
- 2.2. 代碼
??這篇blog長期更新,主要總結matplotlib的作圖技巧,matplotlib涉及畫圖的類有 pyplot(畫圖), axes(坐標軸), figure(圖像)等,一般這三個類都有相應的函數,可以幫助我們進行畫圖,彼此之間有很大的重復,不同的blog一般偏重不同的類,所以給人的感覺就有點亂,點擊類的名字可以超鏈接到各自的官方文檔。
??這篇blog側重axes類,但也會涉及到其他的類。首先導入下面的庫
import numpy as np
import pandas as pd
import seaborn as sns # 畫熱力圖需要的庫,如果不畫熱力圖可以不加
import matplotlib.pyplot as plt # Python畫圖工具
from matplotlib.gridspec import GridSpec # 利用網格確定圖形的位置
??我們就簡單的畫下面的數據到三個大小不同的子圖上。
x1 = np.linspace(1,10,10)
y1 = np.linspace(10,1,10)
x2 = range(1,11)
y2 = np.random.rand(10) # 生成10個隨機數
x3 = np.linspace(0,20,1000)
y3 = np.sin(x3)
1. 畫單圖、并列圖、以及調整圖的大小
1.1. 生成圖像
??plt.figure()生成一個Figure對象,這個方法可以傳入figsize參數調節生成圖像的大小,注意這是整個圖像的大小。
fig = plt.figure(figsize=(20,20))
1.2. 圖中含有中文
??如果圖的標題等含有中文,需要加上下面的代碼,matplotlib默認是不能顯示中文的。
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
??matplotlib默認的英文字體輸出挺丑的,這里我們輸出英文時,改用比較正式的Times New Roman字體。
plt.rcParams['font.sans-serif']=['Times New Roman']
1.3. 設置大標題
??fig.suptitle()函數設置大標題, 該方法可以傳入x,y來調整圖像的位置,注意這里的x,y是整個圖像的x,y,后面axes的某些函數也有x,y,但一般是所畫子圖的x,y ;可以傳入fontsize來改變標題的大小。后面會用axes的set_title()函數來設置子圖的標題,注意標題的作用范圍。
fig.suptitle('測試', fontsize=30, x=0.5, y=0.93)
1.4. 生成子圖
??fig.add_subplot(m, n, x)方法可以用于快速生成相同大小的子圖,返回axes對象,含義是,我們把Figure分成 m × n m\times n m × n 個子圖,生成的子圖是其中的第x個,下面示例生成一個2*2共四個子圖,
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
??當然,如果我們只需要一個圖,就沒有子圖的概念了,可以寫成
ax = fig.add_subplot(1,1,1)
1.5. 網格劃分整個圖像,同時展示不同大小的圖
??這是一種進階方法來生成子圖,利用GridSpec(m, n)把1.1.生成的Figure劃分成m行n列的網格圖,這樣的好處是,我們可以手動設置我們的圖像占據其中的的若干行和若干列,實現同時展示不同大小的圖的功能,設置代碼如下
gs = GridSpec(40, 40) # 把Figure分成40*40的網格圖
# ax1是axes對象,這一步意思是ax1畫的圖在原圖(40*40)占據行5-14,占據列5-14(從零開始索引)
ax1 = fig.add_subplot(gs[5:15, 5:15])
1.6. 畫折線圖
??我們可以利用axes.plot()畫折線圖, label參數會用于圖例 ,這個函數有一些重要的參數可以看官方文檔。
ax1.plot(x1, y1, label='第一個子圖')
1.7. 畫柱狀圖
??我們可以利用axes.bor()畫柱狀圖。
ax2 = fig.add_subplot(gs[:20, 20:]) # ax2畫的圖在原圖(40*40)占據行20-39,占據列20-39(從零開始索引)
ax2.bar(x2, y2, label='第二個子圖')
1.8. 設置子圖的標題
??我們可以利用axes.set_title()設置子圖的標題,注意1.3.設置的是大標題,該方法同樣可以傳入x,y來調整圖像的位置,x,y是相對子圖的x,y;可以傳入fontsize來改變標題的大小。
ax1.set_title('第一', fontsize=30, x=0.5, y=1.02)
1.9. 設置坐標軸的label
??我們可以利用axes.set_xlabel()和axes.set_ylabel()分別設置x,y坐標軸的label,可以傳入fontsize來改變標題的大小
ax1.set_xlabel('X', fontsize=30)
ax1.set_ylabel('Y', fontsize=30)
1.10. 設置以及修改坐標軸的刻度(ticks)
??我們可以利用axes.set_xticks()和axes.set_yticks()分別設置x,y坐標軸的 刻度的位置 ,默認情況下,這些位置也就是刻度標簽,但我們可以通過set_xticklabels()和set_yticklabels()將任何其他的值用作 標簽 。
ax1.set_xticks(range(0,10)) # 告訴matplotlib刻度存在的位置
ax1.set_xticklabels(['a', '上海','b', '廣州','c', '北京','d', '南京','e', '浙江']) # 告訴matplotlib刻度的位置上的刻度應該是什么
??同時,我們可以通過axes.tick_params()修改刻度的一些參數,axis={‘x’, ‘y’, ‘both’}用于確定需要改變的坐標軸, labelsize用于確定刻度的大小,rotation用于確定刻度是否要進行翻轉,一般當x軸刻度過長時,可以設置rotation=90來讓其旋轉90度。
ax1.tick_params(axis='x', labelsize=20, rotation=90) # 改變ticks值
ax1.tick_params(axis='y', labelsize=20) # 改變ticks值
1.11. 設置圖例
??我們可以利用axes.legend()設置圖例,圖例就是我們在1.7或1.8中的label,當然可以重新定義(這一點可以看官網),這里可以通過fontsize調整圖例大小, loc調整圖例的位置。
ax1.legend(fontsize=10, loc='upper right')
??有些高度封裝的函數可能自己帶圖例,如果我們想要移除圖例,可以
axes.legend_.remove()
??如果想把圖例設置到子圖外面,我們可以利用
ax1.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.)
其中參數loc=2就相當于loc=‘upper left’,也就是說,我們要把圖例框的左上角,放在圖的(1.05,1.0)坐標處,也就是放到圖的外面。
1.12. 保存以及顯示圖像
??保存使用plt.savefig(),顯示使用plt.show(), 一定要先保存后顯示 ,因為plt.show()后就會生成一個新的空白圖像,之后使用plt.savefig()就會存成空白的圖像。
plt.savefig('xxx.png') # 一定在plt.show()前面
plt.show()
2. 整體代碼以及結果的展示
2.1. 結果

2.2. 代碼
fig = plt.figure(figsize=(20,20))
plt.rcParams['font.sans-serif']=['SimHei'] # 用于顯示中文
plt.rcParams['axes.unicode_minus'] = False # 用于顯示中文
# plt.rcParams['font.sans-serif']=['Times New Roman']
fig.suptitle('測試', fontsize=30, x=0.5, y=0.93)
# 生成相同大小的4個子圖
# ax1 = fig.add_subplot(2,2,1)
# ax2 = fig.add_subplot(2,2,2)
# ax3 = fig.add_subplot(2,2,3)
# ax4 = fig.add_subplot(2,2,4)
# 生成一個圖
# ax = fig.add_subplot(1,1,1)
gs = GridSpec(40, 40)
# 第一個子圖
ax1 = fig.add_subplot(gs[5:15, 5:15]) # ax1是axes對象,這一步意思是ax1畫的圖在原圖(40*40)占據行5-14,占據列5-14(從零開始索引)
ax1.plot(x1, y1, label='第一個子圖')
ax1.set_title('第一', fontsize=30, x=0.5, y=1.02)
ax1.set_xlabel('X', fontsize=30)
ax1.set_ylabel('Y', fontsize=30)
ax1.set_xticks(range(0,10)) # 告訴matplotlib刻度存在的位置
ax1.set_xticklabels(['a', '上海','b', '廣州','c', '北京','d', '南京','e', '浙江']) # 告訴matplotlib刻度的位置上的刻度應該是什么
# ax1.set_yticks(range(0,10))
# ax1.set_yticklabels()
ax1.tick_params(axis='x', labelsize=20, rotation=90) # 改變ticks值
ax1.tick_params(axis='y', labelsize=20) # 改變ticks值
ax1.legend(fontsize=10, loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.)
# 第二個子圖
ax2 = fig.add_subplot(gs[:20, 20:]) # ax2畫的圖在原圖(40*40)占據行20-39,占據列20-39(從零開始索引)
ax2.bar(x2, y2, label='第二個子圖')
ax2.set_title('第二', fontsize=30, x=0.5, y=1.02)
ax2.set_xlabel('X', fontsize=30)
ax2.set_ylabel('Y', fontsize=30)
ax2.tick_params(axis='x', labelsize=25) # 改變ticks值
ax2.tick_params(axis='y', labelsize=25) # 改變ticks值
ax2.legend(fontsize=30, loc='upper right')
# 第三個子圖
ax3 = fig.add_subplot(gs[22:, :]) # ax3畫的圖在原圖(40*40)占據行22-39,占據所有的列(從零開始索引)
ax3.plot(x3, y3, label='第三個子圖')
ax3.set_title('第三', fontsize=30, x=0.5, y=1.02)
ax3.set_xlabel('X', fontsize=30)
ax3.set_ylabel('Y', fontsize=30)
ax3.tick_params(axis='x', labelsize=25) # 改變ticks值
ax3.tick_params(axis='y', labelsize=25) # 改變ticks值
ax3.legend(fontsize=30, loc='upper right')
plt.savefig('xxx.png')
plt.show()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
