目錄
- 前言
- 1.多圖布局
- 1.1 子視圖
- 1.2 嵌套
- 1.3 多圖布局分格顯示
- 1.3.1 均勻布局
- 1.3.2 不均勻分布
- 1.4 雙軸顯示
- 2.文本、注釋、箭頭
- 2.1 文本
- 2.2 箭頭
- 2.3 注釋
- 2.4 注釋箭頭連接形狀
- 3.訓練場
- 3.1 繪制如下子圖
前言
本文其實屬于:Python的進階之道【AIoT階段一】的一部分內容,本篇把這部分內容單獨截取出來,方便大家的觀看,本文介紹Matplotlib資料可視化高級,讀本文之前,如果沒有 Matplotlib基礎建議先看博客:Matplotlib資料可視化入門,后續還會單獨發一篇Matplotlib資料可視化進階內容供讀者學習,
🌟 學習本文之前,需要先自修:NumPy從入門到進階,pandas從入門到進階本文中很多的操作在 NumPy從入門到進階 ,pandas從入門到進階二文中有詳細的介紹,包含一些軟體以及擴展庫,圖片的安裝和下載流程,本文會直接進行使用,
下載 M a t p l o t l i b Matplotlib Matplotlib 見博客:matplotlib的安裝教程以及簡單呼叫,這里不再贅述
1.多圖布局
1.1 子視圖
🚩創建子視圖可以一個視圖一個視圖的創建,也可以多個視圖一起創建:
單圖創建:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi)
# 創建子視圖:2行1列第1個視圖
ax = plt.subplot(2, 1, 1)
ax.plot(x, np.sin(x))
# 創建子視圖:2行1列第2個視圖
ax = plt.subplot(2, 1, 2)
ax.plot(x, np.cos(x))

多圖一起創建:
# 一次創造多個視圖
fig, axes = plt.subplots(2, 2) # 2行2列:四個圖
# 索引從0開始
axes[0, 0].plot(x, np.sin(x), color = 'red')
axes[0, 1].plot(x, np.sin(x), color = 'green')
axes[1, 0].plot(x, np.cos(x), color = 'purple')
axes[1, 1].plot(x, np.cos(x))

下面附上一個完整的代碼供讀者理解:
遇到無法理解的地方可以看后面的代碼解釋,還是不理解的地方可以評論區留言(有問必答)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
# 子視圖1
plt.figure(figsize = (9, 6))
ax = plt.subplot(221) # 兩行兩列第一個子視圖
ax.plot(x, y, color = 'red')
ax.set_facecolor('green') # 呼叫子視圖設定方法,設定子視圖整體屬性
# 子視圖2
ax = plt.subplot(2, 2, 2) # 兩行兩列第二個子視圖
line, = ax.plot(x, -y) # 回傳繪制物件
line.set_marker('*') # 呼叫物件設定方法,設定屬性
line.set_markerfacecolor('red')
line.set_markeredgecolor('green')
line.set_markersize(10)
# 子視圖3
ax = plt.subplot(2, 1, 2) # 兩行一列第二行視圖
plt.sca(ax) # 設定當前視圖
x = np.linspace(-np.pi, np.pi, 200)
plt.plot(x, np.sin(x * x), color = 'red')

對上述代碼的部分進行講解:
# 第15行
# line, = ax.plot(x, -y) # 回傳繪制物件
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
# 子視圖1
plt.figure(figsize = (9, 6))
ax = plt.subplot(221) # 兩行兩列第一個子視圖
ax.plot(x, y, color = 'red')
ax.set_facecolor('green') # 呼叫子視圖設定方法,設定子視圖整體屬性
# 子視圖2
ax = plt.subplot(2, 2, 2) # 兩行兩列第二個子視圖
ax.plot(x, -y) # 回傳繪制物件

ax.plot(x, -y)其實就是回傳了一句話:[<matplotlib.lines.Line2D at 0x1914fb1d250>]
我們可以發現這句話使用的是串列,我們取出這句話可以用:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
# 子視圖1
plt.figure(figsize = (9, 6))
ax = plt.subplot(221) # 兩行兩列第一個子視圖
ax.plot(x, y, color = 'red')
ax.set_facecolor('green') # 呼叫子視圖設定方法,設定子視圖整體屬性
# 子視圖2
ax = plt.subplot(2, 2, 2) # 兩行兩列第二個子視圖
line = ax.plot(x, -y) # 回傳繪制物件
line[0]

我們也可以使用 , 去取:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
# 子視圖1
plt.figure(figsize = (9, 6))
ax = plt.subplot(221) # 兩行兩列第一個子視圖
ax.plot(x, y, color = 'red')
ax.set_facecolor('green') # 呼叫子視圖設定方法,設定子視圖整體屬性
# 子視圖2
ax = plt.subplot(2, 2, 2) # 兩行兩列第二個子視圖
line, = ax.plot(x, -y) # 回傳繪制物件
line

還有一個很容易暈掉的細節:就是我們在繪圖的時候幾行幾列第幾個是什么意識:
我們就拿上述代碼去說明:
我們假想有一塊空白的板子是供我們繪圖的,下面來看上述代碼:
ax = plt.subplot(221) # 兩行兩列第一個子視圖
這行代碼的意思是把我們假想的這塊白板,劃分稱為兩行兩列的板子:

然后這個圖片占據的是第一個板子的位置,對于板子位置我們有如下規定:
板子的編號從1開始,而非從0開始,從左至右,從上至下依次命名板子
所以對上面這個板子,板子的編號為:

所以我們最后影像所顯示的其實就是左上角的位置,
接著來看我們的第二個圖:
ax = plt.subplot(2, 2, 2) # 兩行兩列第二個子視圖
這下就好理解啦,還是把之前的空白板子分成兩行兩列,然后編號為2,即右上角,
接著我們來看第三個圖:
ax = plt.subplot(2, 1, 2) # 兩行一列第二行視圖
把我們的空白板子分成兩行一列,那么就是下圖的形式:

然后我們把第三個圖片放到第二個位置,不難想到,該圖的第二個位置其實就是對應的我們分成兩行兩列的 3,4 位置,所以三個影像最侄訓制的結果就是:

1.2 嵌套
🚩所謂嵌套,其實就是在圖形中繼續畫圖:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 25)
y = np.sin(x)
fig = plt.figure(figsize = (9, 6)) # 創建視圖
plt.plot(x,y)
# 嵌套方式一,axes軸域(橫縱坐標范圍),子視圖
# x,y,width,height
ax = plt.axes([0.2, 0.55, 0.3, 0.3]) # 引數含義[left, bottom, width, height]
ax.plot(x, y, color = 'g')
# 嵌套方式二
ax = fig.add_axes([0.55, 0.2, 0.3, 0.3]) # 使用視圖物件添加子視圖
ax.plot(x, y, color = 'r')

1.3 多圖布局分格顯示
1.3.1 均勻布局
🚩每張圖片都是均勻展示的
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
# sharex:所有小圖共享x軸 sharey:表示所有小圖共享y軸 坐標軸以所有小圖中范圍最大的進行顯示
fig, ((ax11,ax12,ax13), (ax21,ax22,ax23),(ax31,ax32,ax33)) = plt.subplots(3, 3)
# 也可通過plt.subplot() 一個個添加子視圖
fig.set_figwidth(9)
fig.set_figheight(6)
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tanh(x))
ax21.plot(x,np.tan(x))
ax22.plot(x,np.cosh(x))
ax23.plot(x,np.sinh(x))
ax31.plot(x,np.sin(x) + np.cos(x))
ax32.plot(x,np.sin(x * x) + np.cos(x * x))
ax33.plot(x,np.sin(x) * np.cos(x))
# 緊湊顯示,邊框會比較小,可以注釋掉該行查看效果
plt.tight_layout()
plt.show()

1.3.2 不均勻分布
🚩上圖中代碼運行所展示的就是均勻分布的結果,可以看出每張圖片所占的空間大小都是均等的,如下面圖片的展示結果,就是不均勻分布:

為顯示如上圖的不均勻分布,我們有三種方法
方法一:
import numpy as np
import matplotlib.pyplot as plt
# 需要匯入gridspec模塊
x = np.linspace(0, 2 * np.pi, 200)
fig = plt.figure(figsize = (12, 9))
# 使用切片方式設定子視圖
ax1 = plt.subplot(3, 1, 1) # 視圖物件添加子視圖
ax1.plot(x, np.sin(10 * x))
# 設定ax1的標題,xlim、ylim、xlabel、ylabel等所有屬性現在只能通過set_屬性名的方法設定
ax1.set_title('ax1_title') # 設定小圖的標題
ax2 = plt.subplot(3, 3, (4, 5))
ax2.set_facecolor('green')
ax2.plot(x, np.cos(x),color = 'red')
ax3 = plt.subplot(3, 3, (6, 9))
ax3.plot(x,np.sin(x) + np.cos(x))
ax4 = plt.subplot(3, 3, 7)
ax4.plot([1, 3], [2, 4])
ax5 = plt.subplot(3, 3, 8)
ax5.scatter([1, 2, 3], [0, 2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
plt.show()

方法二:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
plt.figure(figsize = (12, 9))
# 子視圖1
ax1 = plt.subplot2grid(shape = (3, 3),# 布局形狀
loc = (0, 0), # 布局繪制位置
colspan = 3) # 跨幾列
ax1.plot(x, np.sin(10 * x))
# 設定ax1的標題,xlim、ylim、xlabel、ylabel等所有屬性現在只能通過set_屬性名的方法設定
ax1.set_title('ax1_title') # 設定小圖的標題
# 子視圖2
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan = 2) # 跨兩列
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x),color = 'red')
# 子視圖3
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan = 2) # 跨兩行
ax3.plot(x,np.sin(x) + np.cos(x))
# 子視圖4
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.plot([1, 3], [2, 4])
# 子視圖5
ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.scatter([1, 2, 3], [0, 2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)

方法三:
import numpy as np
import matplotlib.pyplot as plt
# 需要匯入gridspec模塊
import matplotlib.gridspec as gridspec
x = np.linspace(0, 2 * np.pi, 200)
fig = plt.figure(figsize = (12, 9))
# 將整個視圖分成3x3布局
gs = gridspec.GridSpec(3, 3)
# 使用切片方式設定子視圖
ax1 = fig.add_subplot(gs[0, :]) # 視圖物件添加子視圖
ax1.plot(x,np.sin(10 * x))
# 設定ax1的標題,xlim、ylim、xlabel、ylabel等所有屬性現在只能通過set_屬性名的方法設定
ax1.set_title('ax1_title') # 設定小圖的標題
ax2 = plt.subplot(gs[1, :2]) # 模塊呼叫
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x), color = 'red')
# 從第一行到最后,占1、2兩行,后面的2表示只占用第二列,也就是最后的一列
ax3 = plt.subplot(gs[1:, 2])
ax3.plot(x,np.sin(x) + np.cos(x))
# 倒數第一行,只占第0列這一列
ax4 = plt.subplot(gs[-1, 0])
ax4.plot([1, 3], [2, 4])
# 倒數第一行,只占倒數第二列,由于總共三列,所以倒數第二列就是序號1的列
ax5 = plt.subplot(gs[-1, -2])
ax5.scatter([1, 2, 3], [0, 2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
plt.show()

1.4 雙軸顯示
🚩有時候,有兩個軸是不夠用的,我們經常會見到如下的圖形,下述圖形的樣式就是雙軸顯示:

就比如我們在繪制正弦波和指數函式的時候,讓他們在一個
y
y
y軸上顯示是不合理的:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
plt.plot(x, y, color = 'blue')
_ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue')
y2 = np.exp(x)
plt.plot(x, y2, color = 'red')

所以,這個時候就需要我們的雙軸顯示:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
plt.plot(x, y, color = 'blue')
_ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue')
# 獲取當前視圖
ax = plt.gca()
# 雙胞胎,相當于兩個x軸,并且是合到一起的
# 這兩個x軸對應的是兩個y軸
ax2 = ax.twinx()
# 其中一個視圖縱坐標范圍是 -1~1.0,另一個視圖范圍是0~25
# 刻度是自適應的,當然也可以進行調整
# 默認向 ax2這個子視圖中繪制
y2 = np.exp(x)
plt.plot(x, y2, color = 'red')

坐標是雖然是自適應的,但是我們也可以對其進行調整:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 50)
y = np.sin(x)
plt.plot(x, y, color = 'blue')
_ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue')
# 獲取當前視圖
ax = plt.gca()
# 雙胞胎,相當于兩個x軸,并且是合到一起的
# 這兩個x軸對應的是兩個y軸
ax2 = ax.twinx()
# 其中一個視圖縱坐標范圍是 -1~1.0,另一個視圖范圍是0~25
# 刻度是自適應的,當然也可以進行調整
# 默認向 ax2這個子視圖中繪制
y2 = np.exp(x)
plt.plot(x, y2, color = 'red')
# 規定刻度
_ = plt.yticks(np.arange(0, 26, 5), color = 'red')

2.文本、注釋、箭頭
🚩常用函式如下:
| Pyplot函式 | API方法 | 描述 |
|---|---|---|
| text() | mpl.axes.Axes.text() | 在Axes物件的任意位置添加文字 |
| xlabel() | mpl.axes.Axes.set_xlabel() | 為X軸添加標簽 |
| ylabel() | mpl.axes.Axes.set_ylabel() | 為Y軸添加標簽 |
| title() | mpl.axes.Axes.set_title() | 為Axes物件添加標題 |
| legend() | mpl.axes.Axes.legend() | 為Axes物件添加圖例 |
| annnotate() | mpl.axes.Axes.annotate() | 為Axes物件添加注釋(箭頭可選) |
| figtext() | mpl.figure.Figure.text() | 在Figure物件的任意位置添加文字 |
| suptitle() | mpl.figure.Figure.suptitle() | 為Figure物件添加中心化的標題 |
2.1 文本
import numpy as np
import matplotlib.pyplot as plt
# 字體屬性
font = {'fontsize': 20,
'family': 'KaiTi',
'color': 'red',
'weight': 'bold'} # bold表示字體加粗
x = np.linspace(0.0, 5.0, 100)
y = np.cos(2 * np.pi * x) * np.exp(-x)
plt.figure(figsize = (9, 6))
plt.plot(x, y, 'k') # k代表黑色
# 視圖的標題
plt.title('exponential decay', fontdict = font, pad = 20)
# figure的大標題
plt.suptitle('指數衰減', y = 1.05, fontdict = font, fontsize = 30)
# 向圖片中繪制文本
plt.text(x = 2, y = 0.65, # 橫縱坐標位置
s = r'$\cos(2 \pi t) \exp(-t)$', # 文本內容
fontsize = 25) # 文本大小
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.show()

2.2 箭頭
import matplotlib.pyplot as plt
import numpy
# 隨機生成數字,10行2列(x,y)
loc = np.random.randint(0, 10,size = (10, 2))
plt.figure(figsize=(10, 10))
# 畫圖: loc[:, 0]:所有行都獲取,索引0--->橫坐標
# loc[:, 1]:所有行都獲取,索引1--->縱坐標
# g*:g代表的是綠色,*代表的是點的形狀是五角星
# ms = 20:點的大小
plt.plot(loc[:, 0], loc[:, 1], 'g*', ms = 20)
plt.grid(True)
# 路徑
way = np.arange(10) # 0、1、2、...、9索引
np.random.shuffle(way) # 洗牌,打亂順序
# 開始連點:0-->1-->2-->...-->9
# for 回圈:少一個:10個點連9條線
for i in range(0, len(way) - 1):
start = loc[way[i]] # 起點
end = loc[way[i + 1]] # 終點
# 畫箭頭:
plt.arrow(start[0], start[1], # x = start[0], y = start[1]:起點的(x, y)
end[0] - start[0], # 水平方向上移動的距離
end[1] - start[1], # 豎直方向上移動的距離
head_width = 0.2, lw = 2,# 箭頭長度,箭尾線寬
length_includes_head = True) # 長度計算包含箭頭箭尾
# 繪制編號:0 1 2 3... 8
plt.text(start[0], start[1], s = i, fontsize = 18, color = 'red')
# 繪制編號:9
if i == len(way) - 2:
plt.text(end[0], end[1], s = i + 1, fontsize = 18, color = 'red')

2.3 注釋
import numpy as np
import matplotlib.pyplot as plt
# 資料創建
fig, ax = plt.subplots()
x = np.arange(0.0, 5.0, 0.01)
y = np.cos(2 * np.pi * x)
line, = ax.plot(x, y, lw = 2)
# 注釋:
ax.annotate('local max', # 文本內容
xy = (2, 1), # 箭頭指向位置
xytext = (3, 1.5), # 文本位置
# 箭頭屬性
arrowprops = dict(facecolor = 'black', # 箭頭的顏色
shrink = 0.05)) # 箭頭兩端收縮的百分比(占總長)
ax.annotate('local min',
xy = (2.5, -1),
xytext = (4, -1.8),
arrowprops = dict(facecolor = 'black',
width = 2, # 箭頭寬度
headwidth = 10, # 箭頭頭部寬度
headlength = 10, # 箭頭頭部長度
shrink = 0.1)) # 箭頭兩端收縮的百分比(占總長)
ax.annotate('median',
xy = (2.25, 0),
xytext = (0.5, -1.8),
arrowprops = dict(arrowstyle = '-|>'), # 箭頭樣式
# 按下 Shift+Tab查看提示:-|>:head_length=0.4,head_width=0.2
fontsize = 20)
# y軸范圍調為(-2, 2)
ax.set_ylim(-2, 2)

2.4 注釋箭頭連接形狀

import matplotlib.pyplot as plt
def annotate_con_style(ax, connectionstyle):
x1, y1 = 3,2
x2, y2 = 8,6
ax.plot([x1, x2], [y1, y2], ".")
ax.annotate(text = '',
xy = (x1, y1), # 相當于B點,arrow head
xytext = (x2, y2), # 相當于A點,arrow tail
arrowprops = dict(arrowstyle = '->', color = 'red',
shrinkA = 5,shrinkB = 5,
connectionstyle = connectionstyle))
ax.text(.05, 0.95, connectionstyle.replace(",", "\n"),
transform = ax.transAxes, # 相對坐標
ha = "left", va = "top") # 指定對齊方式
# 常用箭頭連接樣式
fig, axs = plt.subplots(3, 5, figsize = (9, 6))
annotate_con_style(axs[0, 0], "angle3,angleA=90,angleB=0")
annotate_con_style(axs[1, 0], "angle3,angleA=0,angleB=90")
annotate_con_style(axs[2, 0], "angle3,angleA = 0,angleB=150")
annotate_con_style(axs[0, 1], "arc3,rad=0.")
annotate_con_style(axs[1, 1], "arc3,rad=0.3")
annotate_con_style(axs[2, 1], "arc3,rad=-0.3")
annotate_con_style(axs[0, 2], "angle,angleA=-90,angleB=180,rad=0")
annotate_con_style(axs[1, 2], "angle,angleA=-90,angleB=180,rad=5")
annotate_con_style(axs[2, 2], "angle,angleA=-90,angleB=10,rad=5")
annotate_con_style(axs[0, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=0")
annotate_con_style(axs[1, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=5")
annotate_con_style(axs[2, 3], "arc,angleA=-90,angleB=0,armA=0,armB=40,rad=0")
annotate_con_style(axs[0, 4], "bar,fraction=0.3")
annotate_con_style(axs[1, 4], "bar,fraction=-0.3")
annotate_con_style(axs[2, 4], "bar,angle=180,fraction=-0.2")
for ax in axs.flat:
# 設定軸域刻度
ax.set(xlim = (0, 10), ylim = (0, 10), xticks = [], yticks = [], aspect = 1)
fig.tight_layout(pad = 0.2)

3.訓練場
3.1 繪制如下子圖

要求:
- 設定中文字體并設定字體大小
- 分別計算每個城市年份、季度、月份、小時的PM2.5資料
- 會用到分組求平均值操作
- 進行資料重塑
- 根據需要調整行索引或者列索引
- 創建子視圖2行2列
- 向子視圖分別繪制年份、季度、月份、小時的各城市PM2.5走勢資料
- 根據需要設定坐標軸標簽(比如月份、小時)
首先我們需要下載一個 Excel 檔案:
鏈接: https://pan.baidu.com/s/1nSw6wbOEg8GpP19WQ7ggxw?pwd=53ph
提取碼: 53ph
下載完成之后,把該檔案和我們的代碼放到同一個檔案夾下,這一操作我們在之前的博客中已經反復說到,這里就不再進行演示
注:代碼處于運行中將顯示:

下列代碼運行幾十秒甚至幾分鐘都是正常的,耐心等待運行結果即可,
我們先來加載我們的資料
%%time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'KaiTi'
plt.rcParams['font.size'] = 18
df = pd.read_excel('./PM2.5.xlsx')

接下來繪制年份的資料:
# 添加子視圖
fig, axes = plt.subplots(2, 2, figsize = (16, 12))
# 按照城市年份分組,獲取PM2.5,計算平均值并保留2位小數
df2 = df.groupby(by = ['城市', '年份'])[['PM2.5']].mean().round(2)
# 資料重塑
df2 = df2.unstack(level = 0) # 城市作為列索引
df2.columns = df2.columns.droplevel(0) # 洗掉 PM2.5 這個列索引
df2 = df2[['北京', '上海', '廣州', '沈陽', '成都']] # 調整列索引的順序
df2.plot(ax = axes[0, 0]) # 左上角

繪制季度:
df3 = df.groupby(by = ['城市', '季節'])[['PM2.5']].mean().round(2)
# 資料重塑
df3 = df3.unstack(level = 0)
# 調整行索引順序
df3 = df3.loc[list('春夏秋冬')]
# 洗掉列索引 PM2.5
df3.columns = df3.columns.droplevel(0)
# 調整列索引順序
df3 = df3[['北京', '上海', '廣州', '沈陽', '成都']]
# 第一行第二列的子視圖(右上角)
df3.plot(ax = axes[0, 1])

繪制月份:
df4 = df.groupby(by = ['城市', '月份'])[['PM2.5']].mean().round(2)
# 資料重塑
df4 = df4.unstack(level = 0)
df4.columns = df4.columns.droplevel(0)
df4 = df4[['北京', '上海', '廣州', '沈陽', '成都']]
ax = df4.plot(ax = axes[1, 0])
# 設定
months = ['一月', '二月', '三月', '四月', '五月', '六月',
'七月', '八月', '九月', '十月', '十一月', '十二月']
ax.set_xticks(np.arange(1, 13)) # 設定刻度(x軸)
_ = ax.set_xticklabels(months, rotation = 60) # 旋轉60°

繪制小時:
df5 = df.groupby(by = ['城市', '小時'])[['PM2.5']].mean().round(2)
# 資料重塑
df5 = df5.unstack(level = 0)
df5.columns = df5.columns.droplevel(0)
df5 = df5[['北京', '上海', '廣州', '沈陽', '成都']]
ax = df5.plot(ax = axes[1, 1])
_ = ax.set_xticks(np.arange(0, 24))

最后我們來保存我們的圖片:
plt.savefig('./homework7.png')

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419993.html
標籤:AI
