天氣預報爬蟲

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第1天

摘要:

針對某地的天氣預報資料爬取,選擇了爬取天氣情況,主要有氣溫、降水量、相對溼度、空氣質量AQI四類資料,並對其進行影象還原。

遇到的問題:

首先,直接用PyQuery來直接獲取html原始碼會出現大量亂碼問題,無法得到我們想要的資料

其次,在獲取具體城市天氣預報網頁的超連結時,我們可以採用正則表示式或其他解析庫進行解析來獲取網址。

fd97aff7824c47b085f7b7a21d1e1c80.png ae7a810e80ad4bdcb44c9edcabc8b50b.png

接著,在具體城市的天氣預報網頁中,如果使用PyQuery來解析獲取我們想要的資料,會出現解析錯誤的情況(解析出來的資料並非我們想要的資料),究其原因是因為在同一級標籤中的標籤名與類名都一致,且當中都有script標籤來儲存動態json資料,然後就直接返回了第一個符合我們設定的條件的json字串。使用PyQuery對全文搜尋無法達到我們的目標,且還有個json資料裡面都是以字典型別來儲存相應的資料,需要對json資料進行json解析.

00fbf3a43649481c821df0aba90ece99.png

json解析之後,如何得到相應的json的值,並進行臨時儲存

畫圖時,由於每個城市都有四個圖要畫,如果每個城市分開四個圖片來畫的畫,那麼對於查詢多個城市的適合,會很麻煩,如何解決這一問題?並且在資料儲存中,原資料是字串型別,導致資料需要進行型別轉換,否則最後畫圖時會出現一些座標的偏差

資料的儲存,每次我們只能得到一個城市的資料,如果直接進行儲存,會出現後一個城市將前一個城市的資料給覆蓋掉的情況

解決方法:

對於第一個問題,我們採取了不直接使用PyQuery庫來獲取原始碼,而是採用了最直接的request.get來得到一個伺服器相應response物件。

為什麼用request庫呢?

這是因為request.get得到的伺服器響應的物件中,它的網頁原始碼text函式中,我們可以使用decode方法來設定我們需要的編碼方式進行解析,這樣,我們就可以解決網頁原始碼是亂碼的問題了。

程式碼如下:

python def get_html(self, url): # 設定標頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36' } # 得到get請求的迴應 response = requests.get(url, headers=headers) # 進行文字編碼,去除亂碼情況 html = response.text.encode('iso-8859-1').decode('utf-8') # 返回原始碼 return html 對於第二個問題,正則表示式需要一一匹配,有點過於繁瑣,所以我們採用了PyQuery庫來進行解析,快速且易讀,並且,由於我們的連結在多個相同結構的標籤裡面,那麼用正則匹配出來的是字串,可能是連在一起,不好分離。而PyQuery庫中,我們可以使用items()函式生成一個生成器,通過遍歷生成器裡的內容,可以單獨地獲取我們需要的每一個城市的網址。 程式碼如下:

python def get_new_url(self, html): # 將網頁原始碼轉換成pq物件 html = pq(html) # 獲取具體網址的生成器,其中每個生成器內的子器代表著一個城市的超連結 items = html('div.lqcontentBoxH>div.contentboxTab>div.contentboxTab1>div.contentboxTab2>div.hanml>div.conMidtab>div.conMidtab2>table>tr>td.last>a').items() # 儲存網址 new_url = [] # 獲取href屬性中的內容 for item in items: new_url.append(item.attr('href')) # 返回列表型別的超連結 return new_url 對於第三個問題,因為使用PyQuery庫進行解析不太方便,我們就不再使用pq庫來解析了,而我們以解決1中的程式碼可以得到一個response.text進行過編碼後的網頁原始碼,其型別如text所言,是一個字串型別。我們知道,字串型別用有一個find方法可以幫我們快速找到我們指定的字串內容是否在其之中,存在時會返回第一個字元的索引值。由此,我們可以使用find方法來幫我們快速定位所找json字串的位置;然後對於script標籤的儲存的動態資料,其內容是多層字典的形式,我們可以使用json.loads方法對其進行解析,將字串型別轉換成我們想要的字典型別,程式碼如下:

```python

找到od2後的下一層的具體資料

    text = js_['od']['od2']
    # 找到od1中儲存的城市名
    city = js_['od']['od1']
    # 臨時儲存天氣資料(建立數表),查看了一下資料,除了od23不知道是什麼資料,其他的都可以知道,因此在設定列索引時,我們就直接進行了修改,方便我們後續檢視
    temp_weather = pd.DataFrame([], columns=['時間', '溫度', 'od23', '風向', '風力', '降水量', '相對溼度', '空氣質量'],index=[x+1 for x in range(len(text)-1)])
    # 寫入資料
    for i in range(len(text)):
        # 為什麼需要跳過這個呢?這是因為od2中儲存的其實有25組資料,即25個小時的資料,即會有一個是兩天的同一個時辰的資料,後面畫圖會有些麻煩,這裡為了避歸這一麻煩,且第二天同一時辰的資料對後面也沒有太多的影響,就選擇跳過這一問題了
        if i == 0:
            continue
        # 寫入時間,沒有進行型別變化,因此時間是字串型別,而這裡的橫作為有23開始是因為其字典的順序本身就是反過來的
        temp_weather.iloc[23-i, 0] = text[i]['od21']
        # 寫入溫度,轉換成float型別
        temp_weather.iloc[23-i, 1] = float(text[i]['od22'])
        # od23不清楚指的是什麼內容,但對本爬蟲的要求無影響,故不做處理,之後會進行刪除處理
        temp_weather.iloc[23-i, 2] = text[i]['od23']
        # 寫入風向,字串型別
        temp_weather.iloc[23-i, 3] = text[i]['od24']
        # 寫入風力,由於不做要求,因此不做任何處理,後續會進行刪除處理
        temp_weather.iloc[23-i, 4] = text[i]['od25']
        # 寫入降水量,轉換成浮點型
        temp_weather.iloc[23-i, 5] = float(text[i]['od26'])
        # 寫入相對溼度,轉換成浮點型
        temp_weather.iloc[23-i, 6] = float(text[i]['od27'])
        # 寫入空氣質量,由於最後一處出現缺失(空值),目前還轉換不了浮點型,後面會進行處理
        temp_weather.iloc[23-i, 7] = text[i]['od28']
    # 得到數表後,將od23和風向風力的資料進行刪除
    temp_weather.drop(labels=['od23', '風向', '風力'], axis=1, inplace=True)
    # 將那個字串空值賦予缺失值處理
    temp_weather.iloc[23, 4] = np.nan
    # 將空氣質量的型別由字串轉換成浮點型
    temp_weather['空氣質量'] = temp_weather['空氣質量'].astype('float')
    # 然後將剛剛那個缺失值進行處理,這裡使用的是前填充,使其與上一個小時的AQI值保持一致
    temp_weather.fillna(method='ffill', inplace=True)

```

對於多畫圖問題,我們使用多圖繪畫函式即可,即matplotlib.pyplot.subplot,可以實現多個圖片放在一個圖紙上的操作,減少了麻煩。而對於具體的資料的型別是字串的問題,我們可以在上述儲存資料入數表時進行強制型別轉換。

為什麼當我們的橫軸座標列表的資料是字串時,會出現一個座標軸刻度散亂分佈的情況呢?

其實,這是因為我們在畫圖的時候,函式內部會幫我們把數字型的資料在刻度中按順序排列(沒有用yticks/xticks之前),而當資料是字串時,字串無法進行大小排序,因此,函式只能老老實實地將列表中字串的順序寫入,從而導致了刻度散亂的問題。但是呢,因為如果把時間也給強制型別轉換成整型或者浮點型的話,那麼時間在橫座標上就不再按正常的時間順序從前到後寫入了,而是被排序成0~23來排列,這樣又不符合我們的要求,所以上面在寫入時間的資料時,我們可以看到我並不使用型別轉換。程式碼如下:

```Python def printing(self, df): # 保持時間(為字串型別,這樣子就不會在後續的圖片中出現matplotlib自動將數值進行排序從0開始的情況,使之從今時開始) x = list(df.iloc[:, 0]) # 依次儲存溫度、降水量、相對溼度、空氣質量AOI的值,轉換成列表型別 temperature = list(df.iloc[:, 1]) rainfall = list(df.iloc[:, 2]) humidity = list(df.iloc[:, 3]) air_quality = list(df.iloc[:, 4]) plt.figure(figsize=(20, 10), dpi=80) plt.subplot(221) # AQI圖 # 儲存AQI最大值 max_air = max(air_quality) # 畫出柱形圖 plt.bar(x, air_quality, color='pink', label='空氣質量(AQI)') # 設定橫縱座標軸的標籤--對應顯示的內容的含義 plt.ylabel('數值') plt.xlabel('時間/h') # 設定圖片標題 plt.title(f'{city}市24h內空氣質量變化示意圖') # 設定文字框 plt.text(x=float(min(x)), y=max_air + 0.8, s=f'24h內AQI最高值為{max_air}', color='white', bbox={ 'color': 'gray', 'alpha': 0.5 }) # 顯示出每條柱對應的值 for i in range(len(air_quality)): plt.text(x[i], air_quality[i], '%.0f' % air_quality[i], ha='center', va='bottom', color='#74C476') # 設定網格,僅設定y軸上的橫線 plt.grid(alpha=1, axis='y', linestyle='--') # 設定圖例 plt.legend(loc='upper right')

plt.subplot(222)
# 相對溼度圖
# 儲存最大相對溼度
max_humidty = max(humidity)
# 畫出折線圖以顯示其變化
plt.plot(x, humidity, color='#74C476', label='相對溼度')
# 標出各點
plt.scatter(x, humidity, color='r')
# 設定橫縱座標標籤,橫軸表示時間,縱軸表示相對溼度的大小
plt.ylabel('相對溼度/%')
plt.xlabel('時間/h')
# 設定圖片標題
plt.title(f'{city}市24h內空氣相對溼度變化圖')
# 設定文字框,對圖片進行適當說明
plt.text(x=int(min(x)), y=max_humidty - 0.4, s=f'24h內最高相對溼度為{max_humidty}%', color='white',
         bbox={
             'color': 'gray',
             'alpha': 0.5
         })
# 設定圖例位置
plt.legend(loc='upper center')

# 降水量圖
plt.subplot(223)
# 依次儲存總降水量、最小/大降水量
sum_rain = round(sum(rainfall), 2)
min_rain = min(rainfall)
max_rain = max(rainfall)
# 用柱形圖畫出降水量情況
plt.bar(x, rainfall, color='pink', label='降水量')
# 設定橫縱座標軸的含義,橫軸表示時間,縱軸表示降水量
plt.xlabel('時間/h')
plt.ylabel('降水量/mm')
# 設定圖片標題
plt.title(f'{city}市24h內降水量示意圖')
# 顯示出每條柱對應的值
for i in range(len(rainfall)):
    plt.text(x[i], rainfall[i], '%.1f' % rainfall[i], ha='center', va='bottom', color='#74C476')
# 在圖片中設定文字,內容包含降水極值的說明
# annotate可在樣本點附近進行說明,但是不太美觀
# text自己設定位置放置,統一說明,可以加背景框,顯得好看點,蕪湖,x、y為橫、縱座標,s輸入所需顯示的文字,調色,bbox是設定背景框用的
plt.text(x=int(min(x)), y=max_rain - 0.4, s=f'最高降水量為{max_rain}mm\n最低降水量為{min_rain}mm\n總降水量為{sum_rain}mm',
         color='white',
         bbox={
             'color': 'gray',
             'alpha': 0.5
         })
# 設定網格線
plt.grid(alpha=1, axis='y')
# 設定圖例內容
plt.legend(loc='upper right')

# 氣溫圖
# 儲存最高/低氣溫值
plt.subplot(224)
max_tem = max(temperature)
min_tem = min(temperature)
# 畫出溫度變化圖
plt.plot(x, temperature, color='#74C476', label='溫度')
# 標出各時間段的氣溫點位置
plt.scatter(x, temperature, color='blue')
# 設定橫縱座標軸的含義,橫軸表示時間,縱軸表示氣溫
plt.xlabel('時間/h')
plt.ylabel('溫度/℃')
# 設定圖片標題
plt.title(f'{city}市24h溫度變化示意圖')
# 設定文字框,顯示適當的文字說明以還原影象
plt.text(x=x[5], y=max_tem - 0.3, s=f'最高氣溫為{max_tem}ml\n最低氣溫為{min_tem}ml', color='white',
         bbox={
             'color': 'gray',
             'alpha': 0.5
         })
# 設定圖例位置
plt.legend(loc='upper right')
plt.show()

```

對於第五個問題,目前還沒有處理,而暫時不打算對資料進行儲存

最後就是將以上的方法進行一個類的包裝啦。

全部程式碼如下:

```python import json import pandas as pd import requests from pyquery import PyQuery as pq from matplotlib import pyplot as plt import matplotlib import numpy as np

在圖片中顯示中文

matplotlib.rc("font", family="MicroSoft YaHei", weight='bold', size=13)

class Weather(object): def get_html(self, url): # 設定標頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36' } # 得到get請求的迴應 response = requests.get(url, headers=headers) # 進行文字編碼,去除亂碼情況 html = response.text.encode('iso-8859-1').decode('utf-8') # 返回原始碼 return html

def get_new_url(self, html):
    # 將網頁原始碼轉換成pq物件
    html = pq(html)
    # 獲取具體網址的生成器,其中每個生成器內的子器代表著一個城市的超連結
    items = html('div.lqcontentBoxH>div.contentboxTab>div.contentboxTab1>div.contentboxTab2>div.hanml>div.conMidtab>div.conMidtab2>table>tr>td.last>a').items()
    # 儲存網址
    new_url = []
    # 獲取href屬性中的內容
    for item in items:
        new_url.append(item.attr('href'))
    # 返回列表型別的超連結
    return new_url

def gain_data(self, new_html):
    # 尋找資料開頭位置
    n = new_html.find('observe24h_data')
    # 末尾位置
    m = new_html.find('}]}}')
    # 篩選
    text = new_html[n+18:m+4]
    # 返回篩選後的程式碼資料(字串型別)
    return text

def printing(self, df):
    # 保持時間(為字串型別,這樣子就不會在後續的圖片中出現matplotlib自動將數值進行排序從0開始的情況,使之從今時開始)
    x = list(df.iloc[:, 0])
    # 依次儲存溫度、降水量、相對溼度、空氣質量AOI的值,轉換成列表型別
    temperature = list(df.iloc[:, 1])
    rainfall = list(df.iloc[:, 2])
    humidity = list(df.iloc[:, 3])
    air_quality = list(df.iloc[:, 4])
    # 設定整個的圖紙大小
    plt.figure(figsize=(20, 10), dpi=80)

    plt.subplot(221)
    # AQI圖
    # 儲存AQI的最大值
    max_air = max(air_quality)
    # 畫出柱形圖
    plt.bar(x, air_quality, color='pink', label='空氣質量(AQI)')
    # 設定橫縱座標軸的標籤--對應顯示的內容的含義
    plt.ylabel('數值')
    plt.xlabel('時間/h')
    # 設定圖片標題
    plt.title(f'{city}市24h內空氣質量變化示意圖')
    # 設定文字框
    plt.text(x=float(min(x)), y=max_air + 0.8, s=f'24h內AQI最高值為{max_air}', color='white',
             bbox={
                 'color': 'gray',
                 'alpha': 0.5
             })
    # 顯示出每條柱對應的值
    for i in range(len(air_quality)):
        plt.text(x[i], air_quality[i], '%.0f' % air_quality[i], ha='center', va='bottom', color='#74C476')
    # 設定網格,僅設定y軸上的橫線
    plt.grid(alpha=1, axis='y', linestyle='--')
    # 設定圖例
    plt.legend(loc='upper right')

    plt.subplot(222)
    # 相對溼度圖
    # 儲存最大相對溼度
    max_humidty = max(humidity)
    # 畫出折線圖以顯示其變化
    plt.plot(x, humidity, color='#74C476', label='相對溼度')
    # 標出各點
    plt.scatter(x, humidity, color='r')
    # 設定橫縱座標標籤,橫軸表示時間,縱軸表示相對溼度的大小
    plt.ylabel('相對溼度/%')
    plt.xlabel('時間/h')
    # 設定圖片標題
    plt.title(f'{city}市24h內空氣相對溼度變化圖')
    # 設定文字框,對圖片進行適當說明
    plt.text(x=int(min(x)), y=max_humidty - 0.4, s=f'24h內最高相對溼度為{max_humidty}%', color='white',
             bbox={
                 'color': 'gray',
                 'alpha': 0.5
             })
    # 設定圖例位置
    plt.legend(loc='upper center')

    # 降水量圖
    plt.subplot(223)
    # 依次儲存總降水量、最小/大降水量
    sum_rain = round(sum(rainfall), 2)
    min_rain = min(rainfall)
    max_rain = max(rainfall)
    # 用柱形圖畫出降水量情況
    plt.bar(x, rainfall, color='pink', label='降水量')
    # 設定橫縱座標軸的含義,橫軸表示時間,縱軸表示降水量
    plt.xlabel('時間/h')
    plt.ylabel('降水量/mm')
    # 設定圖片標題
    plt.title(f'{city}市24h內降水量示意圖')
    # 顯示出每條柱對應的值
    for i in range(len(rainfall)):
        plt.text(x[i], rainfall[i], '%.1f' % rainfall[i], ha='center', va='bottom', color='#74C476')
    # 在圖片中設定文字,內容包含降水極值的說明
    # annotate可在樣本點附近進行說明,但是不太美觀
    # text自己設定位置放置,統一說明,可以加背景框,顯得好看點,蕪湖,x、y為橫、縱座標,s輸入所需顯示的文字,調色,bbox是設定背景框用的
    plt.text(x=int(min(x)), y=max_rain - 0.4, s=f'最高降水量為{max_rain}mm\n最低降水量為{min_rain}mm\n總降水量為{sum_rain}mm',
             color='white',
             bbox={
                 'color': 'gray',
                 'alpha': 0.5
             })
    # 設定網格線
    plt.grid(alpha=1, axis='y')
    # 設定圖例內容
    plt.legend(loc='upper right')

    # 氣溫圖
    # 儲存最高/低氣溫值
    plt.subplot(224)
    max_tem = max(temperature)
    min_tem = min(temperature)
    # 畫出溫度變化圖
    plt.plot(x, temperature, color='#74C476', label='溫度')
    # 標出各時間段的氣溫點位置
    plt.scatter(x, temperature, color='blue')
    # 設定橫縱座標軸的含義,橫軸表示時間,縱軸表示氣溫
    plt.xlabel('時間/h')
    plt.ylabel('溫度/℃')
    # 設定圖片標題
    plt.title(f'{city}市24h溫度變化示意圖')
    # 設定文字框,顯示適當的文字說明以還原影象
    plt.text(x=x[5], y=max_tem - 0.3, s=f'最高氣溫為{max_tem}ml\n最低氣溫為{min_tem}ml', color='white',
             bbox={
                 'color': 'gray',
                 'alpha': 0.5
             })
    # 設定圖例位置
    plt.legend(loc='upper right')
    plt.show()

if name == 'main': # 爬取的網址 url = 'http://www.weather.com.cn/textFC/hn.shtml' # 建立天氣爬蟲物件 national_w = Weather() # 得到主頁的html原始碼 html = national_w.get_html(url) # 獲取該地區(華南、華北之類的)的每個城市的天氣預報網址 new_url = national_w.get_new_url(html) n = int(input(f'請輸入要查詢的城市數量(不大於{len(new_url)}的正整數):')) for cnt in range(n): # 獲取具體城市的天氣預報的原始碼 new_html = national_w.get_html(new_url[cnt]) # 獲取script標籤裡面的資料 datas = national_w.gain_data(new_html) # 我們所需要的資料在script標籤裡面的var變數裡,內部是多層的字典型別,因此,我們需要進行json解析轉化成字典型別 js_ = json.loads(datas) # 找到od2後的下一層的具體資料 text = js_['od']['od2'] # 找到od1中儲存的城市名 city = js_['od']['od1'] # 臨時儲存天氣資料(建立數表),查看了一下資料,除了od23不知道是什麼資料,其他的都可以知道, # 因此在設定列索引時,我們就直接進行了修改,方便我們後續檢視 temp_weather = pd.DataFrame([], columns=['時間', '溫度', 'od23', '風向', '風力', '降水量', '相對溼度', '空氣質量'], index=[x+1 for x in range(len(text)-1)]) # 寫入資料 for i in range(len(text)): # 為什麼需要跳過這個呢?這是因為od2中儲存的其實有25組資料,即25個小時的資料, # 即會有一個是兩天的同一個時辰的資料,後面畫圖會有些麻煩,這裡為了避歸這一麻煩, # 且第二天同一時辰的資料對後面也沒有太多的影響,就選擇跳過這一問題了 if i == 0: continue # 寫入時間,沒有進行型別變化,因此時間是字串型別, # 而這裡的橫作為有23開始是因為其字典的順序本身就是反過來的 temp_weather.iloc[23-i, 0] = text[i]['od21'] # 寫入溫度,轉換成float型別 temp_weather.iloc[23-i, 1] = float(text[i]['od22']) # od23不清楚指的是什麼內容,但對本爬蟲的要求無影響,故不做處理,之後會進行刪除處理 temp_weather.iloc[23-i, 2] = text[i]['od23'] # 寫入風向,字串型別 temp_weather.iloc[23-i, 3] = text[i]['od24'] # 寫入風力,由於不做要求,因此不做任何處理,後續會進行刪除處理 temp_weather.iloc[23-i, 4] = text[i]['od25'] # 寫入降水量,轉換成浮點型 temp_weather.iloc[23-i, 5] = float(text[i]['od26']) # 寫入相對溼度,轉換成浮點型 temp_weather.iloc[23-i, 6] = float(text[i]['od27']) # 寫入空氣質量,由於最後一處出現缺失(空值),目前還轉換不了浮點型,後面會進行處理 temp_weather.iloc[23-i, 7] = text[i]['od28'] # 得到數表後,將od23和風向風力的資料進行刪除 temp_weather.drop(labels=['od23', '風向', '風力'], axis=1, inplace=True) # 將那個字串空值賦予缺失值處理 temp_weather.iloc[23, 4] = np.nan # 將空氣質量的型別由字串轉換成浮點型 temp_weather['空氣質量'] = temp_weather['空氣質量'].astype('float') # 然後將剛剛那個缺失值進行處理,這裡使用的是前填充,使其與上一個小時的AQI值保持一致 temp_weather.fillna(method='ffill', inplace=True) # 開始繪製圖像,依次為溫度、降水量、相對溼度、空氣質量AOI的變化示意圖 national_w.printing(temp_weather) ```

補充:

爬蟲偶爾來爬一爬也很不錯,雖然我現在都還是有點難理解如何觀察具體是上面型別的資料。但在這裡,我學到的有對於json字串如何進行處理,如何靈活地使用多個庫進行解析,也包括了一個對於圖片中文字說明的補充有:

plt.text:新增文字,可以自由的設定文字出現的位置,引數s的作用是給我們輸入自己自定義的字串進行顯示。同時還有一個bbox引數,使我們可以設定一個文字框,給文字大致劃個範圍且醒目。與此同時,我們可以在畫柱形圖的時候採用text方法來對每個柱形上面新增其值的大小的文字,使圖片可觀性、易讀性更好

```python plt.text(x=0,#文字x軸座標 y=0, #文字y軸座標 s='basic unility of text', #文字內容

     # 依次設定的是字型大小,顏色和字型種類
     fontdict=dict(fontsize=12, color='r',family='monospace',),#字型屬性字典

     #新增文字背景色
     bbox={'facecolor': 'red', #填充色
          'edgecolor':'y',#外框色
           'alpha': 0.5, #框透明度,值越大越不透明
           'pad': 0.8,#本文與框周圍距離 
           'boxstyle':'sawtooth'
          }

    )

```

plt.annotate:也是添置文字,與text不同的是,我們可以加入一個引數arrowprops使其可以顯示一個箭頭指向所需解釋的點,實現了點與文字分離,但個人感覺有點不太美觀啦

```python plt.annotate('basic unility of annotate', xy=(x, y),#箭頭末端位置

         xytext=(x1, y1),#文字起始位置

         #箭頭屬性設定
        arrowprops=dict(facecolor='red', # 箭頭顏色
                        shrink=1,#箭頭的收縮比
                        alpha=0.5,#透明度
                        width=7,#箭身寬
                        headwidth=40,#箭頭寬
                        hatch='--',#填充形狀
                        frac=0.8,#身與頭比
                        #其它參考matplotlib.patches.Polygon中任何引數
                       ),
        )

```

最終結果展示:

南寧市天氣狀況: 1664801605(1).png 柳州市天氣狀況: 1664801637(1).png

結語:繼續努力,持續學習,有出錯的地方希望各位大佬指正哈~

「其他文章」