Python---Matplotlib(2萬字總結)【從入門到掌握】

數據可視化

在完成了對數據的透視之后,可以將數據透視的結果通過可視化的方式呈現出來,簡單的說,就是將數據變成漂亮的圖表,因為人類對顏色和形狀會更加敏感,然后再進一步解讀數據背后隱藏的價值。在之前的文章中已經為展示過用使用SeriesDataFrame對象的plot方法生成可視化圖表的操作,本文講述的是繪圖方法的基石,它就是充滿視覺化體驗的 matplotlib 庫。

在開始學習 matplotlib 之前,請大看下面這張圖,它給出了常用的圖表類型及其應用場景。在選擇統計圖表時,如果不知道做出怎樣的選擇最合適,相信這張圖就能幫到你。簡單的說,看趨勢折線圖,比數據柱狀圖,定關系散點圖,查占比餅狀圖,看分布直方圖,找離群箱線圖。

在這里插入圖片描述

導入和配置

之前的文章中,有論述過如何安裝和導入 matplotlib 庫,如果不確定是否已經安裝了 matplotlib,可以使用下面的魔法指令嘗試安裝或升級你的 matplotlib。

%pip install -U matplotlib

為了解決 matplotlib 圖表中文顯示的問題,我們需要修改pyplot模塊的rcParams配置參數,具體的操作如下所示。

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'].insert(0, 'SimHei')
plt.rcParams['axes.unicode_minus'] = False

說明:上面代碼中的SimHei是字體名稱,需要將axes.unicode_minus參數設置為False,這樣才能讓坐標軸上的負號正常顯示。

通過下面的魔法指令,可以在繪圖時生成矢量圖(SVG - Scalable Vector Graphics),矢量圖的特點是不會因為放大、縮小或旋轉等操作而失真,看起來會舒服很多。

%config InlineBackend.figure_format='svg'

創建畫布

pyplot模塊的figure函數可以用來創建畫布,創建畫布時,可以通過figsize參數指定畫布的尺寸(默認值是[6.4, 4.8]);可以通過dpi參數設置繪圖的分辨率,因為dpi代表了每英寸的像素點數量。除此之外,還可以通過facecolor參數設置畫布的背景色。figure函數的返回值是一個Figure對象,它代表了繪圖使用的畫布,由此可以基于畫布來創建繪圖使用的坐標系。

plt.figure(figsize=(8, 4), dpi=120, facecolor='darkgray')

創建坐標系

可以直接使用pyplot模塊的subplot函數來創建坐標系,該函數會返回Axes對象。subplot的前三個參數分別用來指定整個畫布分成幾行幾列以及當前坐標系的索引,這三個參數的默認值都是1。如果沒有創建坐標系,繪圖時會使用畫布上默認的也是唯一的一個坐標系;如果需要在畫布上創建多個坐標系,就可以使用該函數。當然,也可以通過上面創建的Figure對象的add_subplot方法或add_axes方法來創建坐標系,前者跟subplot函數的作用一致,后者會產生嵌套的坐標系。

plt.subplot(2, 2, 1)

繪制圖像

折線圖

在繪圖時,如果沒有先調用figure函數和subplot函數,我們將使用默認的畫布和坐標系,如果要繪制折線圖,可以使用pyplot模塊的plot函數,并指定橫軸和縱軸的數據。折線圖適合觀察數據的趨勢,尤其是當橫坐標代表時間的情況下。可以使用plot函數的color參數來定制折線的顏色,可以使用marker參數來定制數據點的標記(例如:*表示五角星,^表示三角形,o表示小圓圈等),可以使用linestyle參數來定制折線的樣式(例如:-表示實線,--表示虛線,:表示點線等),可以使用linewidth參數來定制折線的粗細。 下面的代碼繪制了一條正弦曲線,其中marker='*'會將數據點的標記設置為五角星形狀,而color='red'會將折線繪制為紅色。先
首先,舉一個簡單的例子:繪制一條直線,如下所示:

代碼:

import numpy as np
import matplotlib.pyplot as plt     # 導入 pyplot 模塊
data = np.array([1, 2, 3, 4, 5])     # 準備數據
plt.plot(data)                       # 在當前畫布的繪圖區域中繪制圖表
plt.show()                           # 展示圖表                              #  展示圖表

輸出:
在這里插入圖片描述

代碼:

import numpy as npx = np.linspace(-2 * np.pi, 2 * np.pi, 120)
y = np.sin(x)# 創建畫布
plt.figure(figsize=(8, 4), dpi=120)
# 繪制折線圖
plt.plot(x, y, linewidth=2, marker='*', color='red')
# 顯示繪圖
plt.show()

輸出:

如果要在一個坐標系上同時繪制正弦和余弦曲線,可以對上面的代碼稍作修改。

代碼:

x = np.linspace(-2 * np.pi, 2 * np.pi, 120)
y1, y2 = np.sin(x), np.cos(x)plt.figure(figsize=(8, 4), dpi=120)
plt.plot(x, y1, linewidth=2, marker='*', color='red')
plt.plot(x, y2, linewidth=2, marker='^', color='blue')
# 定制圖表上的標注(annotate函數的參數如果不理解可以先不管它)
plt.annotate('sin(x)', xytext=(0.5, -0.75), xy=(0, -0.25), fontsize=12, arrowprops={'arrowstyle': '->', 'color': 'darkgreen', 'connectionstyle': 'angle3, angleA=90, angleB=0'
})
plt.annotate('cos(x)', xytext=(-3, 0.75), xy=(-1.25, 0.5), fontsize=12, arrowprops={'arrowstyle': '->', 'color': 'darkgreen', 'connectionstyle': 'arc3, rad=0.35'
})
plt.show()

輸出:

如果要使用兩個坐標系分別繪制正弦和余弦,可以用上面提到的subplot函數來創建坐標系,然后再繪圖。

代碼:

plt.figure(figsize=(8, 4), dpi=120)
# 創建坐標系(第1個圖)
plt.subplot(2, 1, 1)
plt.plot(x, y1, linewidth=2, marker='*', color='red')
# 創建坐標系(第2個圖)
plt.subplot(2, 1, 2)
plt.plot(x, y2, linewidth=2, marker='^', color='blue')
plt.show()

輸出:

當然也可以像下面這么做,大家可以運行代碼看看跟上面的圖有什么區別。

plt.figure(figsize=(8, 4), dpi=120)
plt.subplot(1, 2, 1)
plt.plot(x, y1, linewidth=2, marker='*', color='red')
plt.subplot(1, 2, 2)
plt.plot(x, y2, linewidth=2, marker='^', color='blue')
plt.show()

再舉一個實際生活中的例子:未來15天最高氣溫和最低氣溫
代碼:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(4, 19)
y_max = np.array([32, 33, 34, 34, 33, 31, 30, 29, 30, 29, 26, 23, 21, 25, 31])
y_min = np.array([19, 19, 20, 22, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16, 16])
# 繪制折線圖
plt.plot(x, y_max)
plt.plot(x, y_min)
plt.show()

輸出:
在這里插入圖片描述

散點圖

散點圖可以幫助我們了解兩個變量的關系,如果需要了解三個變量的關系,可以將散點圖升級為氣泡圖。下面的代碼中,xy兩個數組分別表示每個月的收入和每個月網購的支出,如果我們想了解xy是否存在相關關系,就可以繪制如下所示的散點圖。

代碼:

x = np.array([5550, 7500, 10500, 15000, 20000, 25000, 30000, 40000])
y = np.array([800, 1800, 1250, 2000, 1800, 2100, 2500, 3500])plt.figure(figsize=(6, 4), dpi=120)
plt.scatter(x, y)
plt.show()

輸出:

在這里插入圖片描述

柱狀圖

在對比數據的差異時,柱狀圖是非常棒的選擇,我們可以使用pyplot模塊的bar函數來生成柱狀圖,也可以使用barh函數來生成水平柱狀圖(也稱為“條狀圖”)。我們先為柱狀圖準備一些數據,代碼如下所示。

x = np.arange(4)
y1 = np.random.randint(20, 50, 4)
y2 = np.random.randint(10, 60, 4)

繪制柱狀圖的代碼。

代碼:

plt.figure(figsize=(6, 4), dpi=120)
# 通過橫坐標的偏移,讓兩組數據對應的柱子分開,width參數控制柱子的粗細,label參數為柱子添加標簽
plt.bar(x - 0.1, y1, width=0.2, label='銷售A組')
plt.bar(x + 0.1, y2, width=0.2, label='銷售B組')
# 定制橫軸的刻度
plt.xticks(x, labels=['Q1', 'Q2', 'Q3', 'Q4'])
# 定制顯示圖例
plt.legend()
plt.show()

輸出:

在這里插入圖片描述

如果想繪制堆疊柱狀圖,可以對上面的代碼稍作修改,如下所示。

代碼:

labels = ['Q1', 'Q2', 'Q3', 'Q4']
plt.figure(figsize=(6, 4), dpi=120)
plt.bar(labels, y1, width=0.4, label='銷售A組')
# 注意:堆疊柱狀圖的關鍵是將之前的柱子作為新柱子的底部,可以通過bottom參數指定底部數據,新柱子繪制在底部數據之上
plt.bar(labels, y2, width=0.4, bottom=y1, label='銷售B組')
plt.legend(loc='lower right')
plt.show()

輸出:

在這里插入圖片描述

餅狀圖

餅狀圖通常簡稱為餅圖,是一個將數據劃分為幾個扇形區域的統計圖表,它主要用于描述數量、頻率等之間的相對關系。在餅圖中,每個扇形區域的大小就是其所表示的數量的比例,這些扇形區域合在一起剛好是一個完整的餅。在需要展示數據構成的場景下,餅狀圖、樹狀圖和瀑布圖是不錯的選擇,可以使用pyplot模塊的pie函數來繪制餅圖,代碼如下所示。

代碼:

data = np.random.randint(100, 500, 7)
labels = ['蘋果', '香蕉', '桃子', '荔枝', '石榴', '山竹', '榴蓮']plt.figure(figsize=(5, 5), dpi=120)
plt.pie(data,# 自動顯示百分比autopct='%.1f%%',# 餅圖的半徑radius=1,# 百分比到圓心的距離pctdistance=0.8,# 顏色(隨機生成)colors=np.random.rand(7, 3),# 分離距離# explode=[0.05, 0, 0.1, 0, 0, 0, 0],# 陰影效果# shadow=True,# 字體屬性textprops=dict(fontsize=8, color='black'),# 楔子屬性(生成環狀餅圖的關鍵)wedgeprops=dict(linewidth=1, width=0.35),# 標簽labels=labels
)
# 定制圖表的標題
plt.title('水果銷售額占比')
plt.show()

輸出:

在這里插入圖片描述

說明:可以試一試將上面代碼中被注釋的部分恢復,看看有什么樣的效果哦。

直方圖

在統計學中,直方圖是一種展示數據分布情況的圖形,是一種二維統計圖表,它的兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量。下面的數據是某學校100名男學生的身高,如果我們想知道數據的分布,就可以使用直方圖。

heights = np.array([170, 163, 174, 164, 159, 168, 165, 171, 171, 167, 165, 161, 175, 170, 174, 170, 174, 170, 173, 173, 167, 169, 173, 153, 165, 169, 158, 166, 164, 173, 162, 171, 173, 171, 165, 152, 163, 170, 171, 163, 165, 166, 155, 155, 171, 161, 167, 172, 164, 155, 168, 171, 173, 169, 165, 162, 168, 177, 174, 178, 161, 180, 155, 155, 166, 175, 159, 169, 165, 174, 175, 160, 152, 168, 164, 175, 168, 183, 166, 166, 182, 174, 167, 168, 176, 170, 169, 173, 177, 168, 172, 159, 173, 185, 161, 170, 170, 184, 171, 172
])

可以使用pyplot模塊的hist函數來繪制直方圖,其中bins參數代表了我們使用的分箱方式(身高從150厘米到190厘米,每5厘米為一個分箱),代碼如下所示。

代碼:

plt.figure(figsize=(6, 4), dpi=120)
# 繪制直方圖
plt.hist(heights, bins=np.arange(145, 196, 5), color='darkcyan')
# 定制橫軸標簽
plt.xlabel('身高')
# 定制縱軸標簽
plt.ylabel('概率密度')
plt.show()

輸出:

在這里插入圖片描述

繪制直方圖時,如果將hist函數的density參數修改為True,同時將cumulative參數也修改為True,那么一方面縱軸會顯示為概率密度,而圖表會繪制概率的累計分布,如下所示。

代碼:

plt.figure(figsize=(6, 4), dpi=120)
# 繪制直方圖
plt.hist(heights, bins=np.arange(145, 196, 5), color='darkcyan', density=True, cumulative=True)
# 定制橫軸標簽
plt.xlabel('身高')
# 定制縱軸標簽
plt.ylabel('概率')
plt.show()

輸出:

在這里插入圖片描述

箱線圖

箱線圖又叫箱型圖或盒須圖,是一種用于展示一組數據分散情況的統計圖表,如下所示。因圖形如箱子,而且在上下四分位數之外有線條像胡須延伸出去而得名。在箱線圖中,箱子的上邊界是上四分位數( Q 3 Q_3 Q3?)的位置,箱子的下邊界是下四分位數( Q 1 Q_1 Q1?)的位置,箱子中間的線條是中位數( Q 2 Q_2 Q2?)的位置,而箱子的長度就是四分位距離(IQR)。除此之外,箱子上方線條的邊界是最大值,箱子下方線條的邊界是最小值,這兩條線之外的點就是離群值(outlier)。所謂離群值,是指數據小于 Q 1 ? 1.5 × I Q R Q_1 - 1.5 \times IQR Q1??1.5×IQR或數據大于 Q 3 + 1.5 × I Q R Q_3 + 1.5 \times IQR Q3?+1.5×IQR的值,公式中的1.5還可以替換為3來發現極端離群值(extreme outlier),而介于1.53之間的離群值通常稱之為適度離群值(mild outlier)。

可以使用pyplot模塊的boxplot函數來繪制箱線圖,代碼如下所示。

代碼:

# 數組中有47個[0, 100)范圍的隨機數
data = np.random.randint(0, 100, 47)
# 向數組中添加三個可能是離群點的數據
data = np.append(data, 160)
data = np.append(data, 200)
data = np.append(data, -50)plt.figure(figsize=(6, 4), dpi=120)
# whis參數的默認值是1.5,將其設置為3可以檢測極端離群值,showmeans=True表示在圖中標記均值的位置
plt.boxplot(data, whis=1.5, showmeans=True, notch=True)
# 定制縱軸的取值范圍
plt.ylim([-100, 250])
# 定制橫軸的刻度
plt.xticks([1], labels=['data'])
plt.show()

輸出:

在這里插入圖片描述

說明:由于數據是隨機生成的,運行上面的代碼生成的圖表可能跟我這里并不相同,以實際運行結果為準。

顯示或保存圖像

可以使用pyplot模塊的show函數來顯示繪制的圖表,在上面的代碼中使用過這個函數。如果希望保存圖表,可以使用savefig函數。需要注意的是,如果要同時顯示和保存圖表,應該先執行savefig函數,再執行show函數,因為在調用show函數時,圖表已經被釋放,位于show函數之后的savefig保存的只是一個空白的區域。

plt.savefig('chart.png')
plt.show()

其他圖表

使用 matplotlib,還可以繪制出其他的統計圖表(如:雷達圖、玫瑰圖、熱力圖等),但實際應用中,使用頻率最高的幾類圖表在上面已經為大家完整的展示出來了。此外,matplotlib 還有很多對統計圖表進行定制的細節,例如定制坐標軸、定制圖表上的文字和標簽等。如果想了解如何用 matplotlib 繪制和定制更多的統計圖表,可以直接查看 matplotlib 官方網站上的文檔和示例。

接下來,讓我們一起嘗試用 matplotlib 來繪制一些高階統計圖表。正如上面所說的,大家可以通過 matplotlib 官方網站來學習如何使用 matplotlib 并繪制出更加高級的統計圖表;尤其是在定制一些比較復雜的圖表時,建議大家直接找到官網提供的示例,然后只需要做出相應的修改,就可以繪制出自己想要的圖表。這種“拷貝+修改”的做法應該會大大提高你的工作效率,因為大多數時候,你的代碼跟官網上的代碼就僅僅是數據有差別而已,沒有必要去做重復乏味的事情。

氣泡圖

氣泡圖可以用來了解三個變量之間的關系,通過比較氣泡位置和大小來分析數據維度之間的相關性。例如在我們之前繪制的月收入和網購支出的散點圖中,我們已經發現了二者的正相關關系,如果我們引入第三個變量網購次數,那么我們就需要使用氣泡圖來進行展示。

代碼:

income = np.array([5550, 7500, 10500, 15000, 20000, 25000, 30000, 40000])
outcome = np.array([800, 1800, 1250, 2000, 1800, 2100, 2500, 3500])
nums = np.array([5, 3, 10, 5, 12, 20, 8, 10])# 通過scatter函數的s參數和c參數分別控制面積和顏色
plt.scatter(income, outcome, s=nums * 30, c=nums, cmap='Reds')
# 顯示顏色條
plt.colorbar()
# 顯示圖表
plt.show()

輸出:

在這里插入圖片描述

面積圖

面積圖又叫堆疊折線圖,是在折線圖的基礎上,對折線以下的區域進行顏色填充(展示面積),用于在連續間隔或時間跨度上展示數值,一般用來顯示趨勢和對比數值,不同顏色的填充可以讓多個面積塊之間的對比和趨勢更好的突顯。下面的例子中,用面積圖來展示從周一到周日花在睡覺、吃飯、工作和玩耍上的時間。

代碼:

plt.figure(figsize=(8, 4))
days = np.arange(7)
sleeping = [7, 8, 6, 6, 7, 8, 10]
eating = [2, 3, 2, 1, 2, 3, 2]
working = [7, 8, 7, 8, 6, 2, 3]
playing = [8, 5, 9, 9, 9, 11, 9]
# 繪制堆疊折線圖
plt.stackplot(days, sleeping, eating, working, playing)
# 定制橫軸刻度
plt.xticks(days, labels=[f'星期{x}' for x in '一二三四五六日'])
# 定制圖例
plt.legend(['睡覺', '吃飯', '工作', '玩耍'], fontsize=10)
# 顯示圖表
plt.show()

輸出:

雷達圖

雷達圖通常用來比較多個定量數據,用于查看哪些變量具有相似的值。 雷達圖也可用于查看數據集中哪些變量的值比較低,哪些變量的值比較高,是顯示性能或表現的理想選擇。經常觀看籃球、足球比賽的讀者或者是玩過王者榮耀的玩家應該對雷達圖非常熟悉,例如在 NBA 的轉播中就經常使用雷達圖來展示球員的各項數據,使用雷達圖對游戲角色,局內表現進行分析。雷達圖的本質折線圖,只不過將折線圖映射到了極坐標系。在繪制雷達圖時,需要讓折線閉合,簡單的說就是首尾相連,下面是繪制雷達圖的代碼。

代碼:

labels = np.array(['速度', '力量', '經驗', '防守', '發球', '技術'])
# 馬龍和水谷隼的數據
malong_values = np.array([93, 95, 98, 92, 96, 97])
shuigu_values = np.array([30, 40, 65, 80, 45, 60])
angles = np.linspace(0, 2 * np.pi, labels.size, endpoint=False)
# 多加一條數據讓圖形閉合
malong_values = np.append(malong_values, malong_values[0])
shuigu_values = np.append(shuigu_values, shuigu_values[0])
angles = np.append(angles, angles[0])
# 創建畫布
plt.figure(figsize=(4, 4), dpi=120)
# 創建坐標系
ax = plt.subplot(projection='polar')
# 繪圖和填充
plt.plot(angles, malong_values, color='r', linewidth=2, label='馬龍')
plt.fill(angles, malong_values, color='r', alpha=0.3)
plt.plot(angles, shuigu_values, color='g', linewidth=2, label='水谷隼')
plt.fill(angles, shuigu_values, color='g', alpha=0.2)
# 顯示圖例
ax.legend()
# 顯示圖表
plt.show()

輸出:

玫瑰圖

玫瑰圖是映射在極坐標下的柱狀圖,由弗羅倫斯·南丁格爾(Florence Nightingale)所發明,當年是南丁格爾用來呈現戰地醫院季節性死亡率的一種圖表。由于半徑和面積的關系是平方的關系,南丁格爾玫瑰圖會將數據的比例大小夸大,尤其適合對比大小相近的數值,同時由于圓形有周期的特性,所以南丁格爾玫瑰圖也適用于表示一個周期內的時間概念,比如星期、月份。

代碼:

group1 = np.random.randint(20, 50, 4)
group2 = np.random.randint(10, 60, 4)
x = np.array([f'A組-Q{i}' for i in range(1, 5)] + [f'B組-Q{i}' for i in range(1, 5)])
y = np.array(group1.tolist() + group2.tolist())
# 玫瑰花瓣的角度和寬度
theta = np.linspace(0, 2 * np.pi, x.size, endpoint=False)
width = 2 * np.pi / x.size
# 生成8種隨機顏色
colors = np.random.rand(8, 3)
# 將柱狀圖投影到極坐標
ax = plt.subplot(projection='polar')
# 繪制柱狀圖
plt.bar(theta, y, width=width, color=colors, bottom=0)
# 設置網格
ax.set_thetagrids(theta * 180 / np.pi, x, fontsize=10)
# 顯示圖表
plt.show()

輸出:

3D圖

matplotlib 還可以用于繪制3D圖,具體的內容可以參考官方文檔,下面用一段簡單的代碼為大家展示如何繪制3D圖表。

代碼:

from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure(figsize=(8, 4), dpi=120)
# 創建3D坐標系并添加到畫布上
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)
x = np.arange(-2, 2, 0.1)
y = np.arange(-2, 2, 0.1)
x, y = np.meshgrid(x, y)
z = (1 - y ** 5 + x ** 5) * np.exp(-x ** 2 - y ** 2)
# 繪制3D曲面
ax.plot_surface(x, y, z)
# 顯示圖表
plt.show()

輸出:

需要指出的是, JupyterLab 中渲染的3D圖并不是真正的3D圖,因為你沒有辦法調整觀察者的視角,也沒有辦法旋轉或者縮放。如果想要看到真正的3D效果,需要在將圖表渲染到 Qt 窗口中,為此我們可以先安裝名為 PyQt6 的三方庫,如下所示。

%pip install PyQt6

然后,我們使用魔法指令讓 JupyterLab 將圖表渲染到 Qt 窗口中。

%matplotlib qt

在完成上面的操作后,可以重新運行剛才繪制3D圖的代碼,看到如下所示的窗口。在這個窗口中,可以通過鼠標對3D進行旋轉、縮放,有可以選中圖表的一部分數據進行觀測,是不是非常的酷!

在這里插入圖片描述

通過上面的學習,我們已經對數據可視化工具 matplotlib 有一個初步的認知。大家可能也會發現了,matplotlib 提供的函數雖然強大,但是參數太多,要想對圖表進行深度的定制就需要修改一系列的參數,這一點對新手并不友好。另一方面,使用 matplotlib 定制的統計圖是靜態圖表,可能在某些需要交互效果的場景下并不合適。為了解決這兩個問題,下面為大家介紹兩個新的可視化工具,一個是 seaborn,一個是 pyecharts。

Seaborn

Seaborn 是建立在 matplotlib 之上的數據可視化工具,它相當于是對 matplotlib 進行了更高級的封裝,而且 seaborn 也能跟 pandas 無縫整合,讓我們可以用更少的代碼構建出更好的統計圖表,幫助我們探索和理解數據。Seaborn 包含但不局限于以下描述的功能:

  1. 面向數據集的 API,可用于檢查多個變量之間的關系。
  2. 支持使用分類變量來顯示觀察結果或匯總統計數據。
  3. 能夠可視化單變量或雙變量分布以及在數據子集之間進行比較的選項
  4. 各類因變量線性回歸模型的自動估計與作圖。
  5. 集成調色板和主題,輕松定制統計圖表的視覺效果。

可以使用 Python 的包管理工具 pip 來安裝 seaborn。

pip install seaborn

在 Jupyter 中,可以直接使用魔法指令進行安裝,如下所示。

%pip install seaborn

下面,我們用 seaborn 自帶的數據集為例,為大家簡單的展示 seaborn 的用法和強大之處,想要深入研究 seaborn 的讀者可以自行閱讀官方文檔和并查看官方作品集中的示例。根據官方示例來編寫自己的代碼是一個不錯的選擇,簡單的說就是保留官方代碼,將數據換成自己的數據即可。下圖展示了 seaborn 繪制圖表的函數,可以看出,seaborn 的這些函數主要支持我們通過繪制圖表來探索數據的關系、分布和分類。

使用 seaborn,首先需要導入該庫并設置主題,代碼如下所示。

import seaborn as snssns.set_theme()

如果需要在圖表上顯示中文,還需要用之前講過的方法修改 matplotlib 的配置參數,代碼如下所示。

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'].insert(0, 'SimHei')
plt.rcParams['axes.unicode_minus'] = False

注意:上面的代碼必須放在調用 set_theme 函數之后,否則調用 set_theme 函數時又會重新修改 matplotlib 配置參數中的字體設置。

加載官方的 Tips 數據集(就餐小費數據)。

tips_df = sns.load_dataset('tips')
tips_df.info()

運行結果如下所示,其中 total_bill 表示賬單總金額,tip 表示小費的金額,sex 是顧客的性別,smoker 表示顧客是否抽樣,day 代表星期幾,time 代表是午餐還是晚餐,size 是就餐人數。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 244 entries, 0 to 243
Data columns (total 7 columns):#   Column      Non-Null Count  Dtype   
---  ------      --------------  -----   0   total_bill  244 non-null    float64 1   tip         244 non-null    float64 2   sex         244 non-null    category3   smoker      244 non-null    category4   day         244 non-null    category5   time        244 non-null    category6   size        244 non-null    int64   
dtypes: category(4), float64(2), int64(1)
memory usage: 7.4 KB

由于數據集是聯網加載的,上述代碼可能因為 SSL 的原因無法獲取到數據,可以嘗試先運行下面的代碼,然后再加載數據集。

import sslssl._create_default_https_context = ssl._create_unverified_context

如果希望了解賬單金額的分布,可以使用下面的代碼來繪制分布圖。

sns.histplot(data=tips_df, x='total_bill', kde=True)

如果想了解變量之間的兩兩關系,我們可以繪制點對圖,代碼和效果如下所示。

sns.pairplot(data=tips_df, hue='sex')

將上面的代碼稍作修改,看看運行結果有什么差別。

sns.pairplot(data=tips_df, hue='sex', palette='Dark2')

接下來,為 total_bill 和 tip 兩組數據繪制聯合分布圖,代碼如下所示。

sns.jointplot(data=tips_df, x='total_bill', y='tip', hue='sex')

在這里插入圖片描述

上面清晰的展示了,total_bill 和 tip 之間存在正相關關系,這一點也可以通過 DataFrame 對象的 corr 方法進行驗證。接下來,可以建立回歸模型來擬合這些數據點,而 seaborn 的線性回歸模型圖已經幫實現了這項功能,代碼如下所示。

sns.lmplot(data=tips_df, x='total_bill', y='tip', hue='sex')

在這里插入圖片描述

如果希望了解賬單金額的集中和離散趨勢,可以繪制箱線圖或小提琴圖,代碼如下所示,將數據按星期四、星期五、星期六和星期天分別進行展示。

sns.boxplot(data=tips_df, x='day', y='total_bill')

sns.violinplot(data=tips_df, x='day', y='total_bill')

說明:相較于箱線圖,小提琴圖沒有標注異常點而是顯示了數據的整個范圍,另一方面,小提琴圖很好的展示了數據的分布(密度軌跡)。

累了,最后讓Al總結下叭~~~

這篇文檔是一份關于數據可視化的教程,主要介紹了如何使用Python的matplotlib和seaborn庫來創建和定制各種統計圖表。文檔首先解釋了數據可視化的重要性,然后逐步介紹了matplotlib的基本使用,包括如何安裝、配置、創建畫布和坐標系,以及如何繪制折線圖、散點圖、柱狀圖、餅狀圖、直方圖和箱線圖等。此外,還探討了如何繪制更高級的圖表,如氣泡圖、面積圖、雷達圖、玫瑰圖和3D圖。最后,文檔介紹了seaborn庫,它提供了更簡潔的API和美觀的主題,特別適合與pandas庫結合使用,以更高效地探索和理解數據。通過豐富的代碼示例和圖表輸出,文檔為讀者提供了一個全面的學習資源。

希望文章會對您有所幫助~~~

有關Numpy和Pandas的內容在主頁也有詳細介紹哦~

Pandas萬字總結1

Numpy萬字總結1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17846.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17846.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17846.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nacos安裝與使用

1.nacos簡介與安裝 什么是注冊中心&#xff08;服務治理&#xff09; 服務注冊&#xff1a;服務提供者provider&#xff0c;啟動的時候向注冊中心上報自己的網絡信息 服務發現&#xff1a;服務消費者consumer&#xff0c;啟動的時候向注冊中心上報自己的網絡信息&#xff0c;拉…

JavaScript style 樣式屬性操作

JavaScript 中可以使用 style 對象來操作元素的樣式屬性。style 對象是元素的一個屬性&#xff0c;通過它可以訪問和修改元素的內聯樣式屬性。 要訪問元素的樣式屬性&#xff0c;可以使用以下語法&#xff1a; element.style.property 其中&#xff0c;element 是要操作的元…

centos7防火墻入站白名單配置

firewall-cmd --set-default-zonedropfirewall-cmd --get-active-zone記錄下當前激活網卡firewall-cmd --permanent --change-interfaceens33 --zonedrop firewall-cmd --zonedrop --list-all 添加信任的源IP和開放端口 firewall-cmd --permanent --add-source192.168.254.1 -…

【OpenCV】圖形繪制與填充

介紹了繪制、填充圖像的API。也介紹了RNG類用來生成隨機數。相關API&#xff1a; line() rectangle() circle() ellipse() putText() 代碼&#xff1a; #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv…

ARM64的KASLR分析

基本概念 加載地址&#xff1a;內核解壓到物理內存上的物理起始地址 鏈接地址&#xff1a;內核編譯鏈接后的虛擬起始地址 我們的這篇 文章&#xff0c;介紹了加載地址可以是自動的&#xff0c;也可以是固定的&#xff1b;一般都是物理內存的起始地址 一個偏移 &#xff1b;…

pillow學習3

Pillow庫中&#xff0c;圖像的模式代表了圖像的顏色空間。以下是一些常見的圖像模式及其含義&#xff1a; L&#xff08;灰度圖&#xff09;&#xff1a;L模式表示圖像是灰度圖像&#xff0c;每個像素用8位表示&#xff08;范圍為0-255&#xff09;&#xff0c;0表示黑色&#…

在flutter initState 方法,觸發 setState導致循環執行

在Flutter中&#xff0c;如果你在initState中調用了一個方法&#xff0c;并且這個方法可能導致狀態更新&#xff0c;這可能會引起無限循環&#xff0c;因為每次狀態更新都會再次調用initState。 為了避免這種情況&#xff0c;你應該檢查調用的方法是否會導致狀態更新&#xff…

圖算法新書發布會圓滿成功,大咖現場都講了啥?

5月24日&#xff0c;嬴圖與機工社攜手舉辦的“《圖算法&#xff1a;行業應用與實踐》新書發布會”圓滿成功。 現場直播在線觀眾達4000人/次左右&#xff0c;點贊數量超7000&#xff0c;直至發布會尾聲&#xff0c;觀看人數仍在持續增長。 通過觀眾們的反饋&#xff0c;我們也對…

Matplotlib 實踐指南:圖形樣式、風格與標記探索

目錄 前言 第一點&#xff1a;導入模塊 第二點&#xff1a;創建二維圖 第三點&#xff1a;創建統計圖 總結 前言 Matplotlib 是一個強大的數據可視化庫&#xff0c;可用于創建各種類型的圖形。在本文中&#xff0c;我們將研究如何在 Matplotlib 中設置圖形的顏色、風格和標記…

【LeetCode算法】第88題:合并兩個有序數組

目錄 一、題目描述 二、初次解答 三、官方解法 四、總結 一、題目描述 二、初次解答 1. 思路&#xff1a;首次想到的解法&#xff1a;定義一個mn長度的輔助數組&#xff0c;從頭遍歷這兩個數組&#xff0c;誰小就放進輔助數組中并且對應往后走&#xff0c;最后使用memcpy函…

巧用java8的stream流的.collect(Collectors.toMap(arg1,arg2))

最近公司接手了一個低代碼二次開發平臺的需求&#xff0c;需要連接多張表的數據然后展示到界面上。 按照java的sql思路&#xff0c;我們直接通過left join去關聯表就行了&#xff0c;但是該低代碼平臺有對sql連表查詢有限制&#xff0c;就是有些表它是存在一個domainKey的&…

HotSpot虛擬機的幾個實現細節

文章目錄 STW安全點安全區域記憶集與卡表讀寫屏障 STW 收集器在根節點枚舉這步都是必須要暫停用戶線程的&#xff08; STW &#xff09;&#xff0c;如果不這樣的話在根節點枚舉的過程中由于引用關系在不斷變化&#xff0c;分析的結果就不準確 安全點 收集器在工作的時候某些…

切勿安裝這五款流氓軟件,你中招了沒

流氓軟件&#xff0c;又稱為惡意軟件&#xff0c;是一類設計用來損害用戶設備、竊取信息或干擾正常使用的程序。以下是五款臭名昭著的流氓軟件介紹&#xff0c;提醒切勿安裝&#xff0c;只能說一個比一個毒&#xff0c;你中招了沒 可以去去虛擬機試試誰的毒更強一些&#xff0…

高工咨詢:《2024中國人形機器人產業發展藍皮書》

高工咨詢所發布的《2024中國人形機器人產業發展藍皮書》全面梳理了人形機器人產業的發展現狀、政策環境、資本市場、技術發展、市場前景以及面臨的機遇與挑戰等情況。 人形機器人是當今世界科技領域最具潛力和前景的產業之一。隨著科技的不斷進步和人 工智能技術的快速發展&…

基于jeecgboot-vue3的Flowable增加表單功能(二)

因為這個項目license問題無法開源&#xff0c;更多技術支持與服務請加入我的知識星球。 接上一節 6、增加一個types.ts 類型 export interface FormForm {id: number | string | undefined;formName: string;formContent?: string;remark: string; } 7、api增加一個getForm…

Github Page 部署失敗

添加 .gitmodules 文件 [submodule "themes/ayer"]path themes/ayerurl https://github.com/Shen-Yu/hexo-theme-ayer.git 添加 .nojekyll 文件

React Fiber

React引入Fiber前后的區別&#xff1a; 渲染流程的控制&#xff1a; 之前&#xff1a;在Fiber之前&#xff0c;React的渲染過程是一個相對線性的深度優先遍歷過程&#xff0c;從根節點開始遍歷整個組件樹&#xff0c;這個過程一旦開始就無法中斷&#xff0c;直到完成。如果遇到…

滾珠花鍵在工業自動化領域中有什么優勢?

滾珠花鍵是工業自動化設備中重要的傳動系統之一&#xff0c;不僅在工業自動化系統中有著廣泛的運用&#xff0c;還在機械制造領域、航空航天領域、工業汽車領域、工業機器人、高速鐵路、新能源領域 等都得到廣泛應用。由于具有高精度、高承載、耐磨損、傳遞扭矩大等特點&#x…

android 關于自定義View在特殊情況下觸發setPressed方法(View源碼解析)

文章目錄 前言一、為什么樣式會變&#xff1f;二、調試發現原因并解決1.找到原因2.解決 總結 前言 最近在負責一些UI相關的工作,測試給到一個UI的bug,說是搜索框在點擊的時候,旁邊的’‘X’變成按壓的效果了,我轉手就把bug轉給負責公控的同事了,因為這個搜索框是公控同事提供的…

Mysql常用操作DDL數據庫、表操作:

SQl DDl-數據庫操作 查詢 查詢所有數據庫 show databases; 查詢當前數據庫 select database(); 創建 create database [if not exists] 數據庫名 [default charset 字符集] [collate 排序規則]; 刪除 drop database[if exists] 數據庫名; 使用 use 數據庫名;…