主頁 >  其他 > Matplotlib資料可視化高級

Matplotlib資料可視化高級

2022-01-24 07:21:06 其他

目錄

  • 前言
  • 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

上一篇:[Python從零到壹] 三十四.OpenCV入門詳解——顯示讀取修改及保存影像

下一篇:《繁凡的深度學習筆記》第 2 章 回歸問題與神經元模型(DL筆記整理系列)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more