數據可視化
在完成了對數據的透視之后,可以將數據透視的結果通過可視化的方式呈現出來,簡單的說,就是將數據變成漂亮的圖表,因為人類對顏色和形狀會更加敏感,然后再進一步解讀數據背后隱藏的價值。在之前的文章中已經為展示過用使用Series或DataFrame對象的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()
輸出:

散點圖
散點圖可以幫助我們了解兩個變量的關系,如果需要了解三個變量的關系,可以將散點圖升級為氣泡圖。下面的代碼中,x和y兩個數組分別表示每個月的收入和每個月網購的支出,如果我們想了解x和y是否存在相關關系,就可以繪制如下所示的散點圖。
代碼:
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.5到3之間的離群值通常稱之為適度離群值(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 包含但不局限于以下描述的功能:
- 面向數據集的 API,可用于檢查多個變量之間的關系。
- 支持使用分類變量來顯示觀察結果或匯總統計數據。
- 能夠可視化單變量或雙變量分布以及在數據子集之間進行比較的選項
- 各類因變量線性回歸模型的自動估計與作圖。
- 集成調色板和主題,輕松定制統計圖表的視覺效果。
可以使用 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