Pandas繪圖
學習目标
1 Pandas資料可視化簡介
- pandas庫是Python資料分析的核心庫
- 它不僅可以加載和轉換資料,還可以做更多的事情:它還可以可視化
- pandas繪圖API簡單易用,是pandas流行的重要原因之一
2 Pandas 單變量可視化
- 單變量可視化, 包括條形圖、折線圖、直方圖、餅圖等
- 資料使用葡萄酒評論資料集, 來自葡萄酒愛好者雜志(wineEnthusiast),包含10個字段,150929行,每一行代表一款葡萄酒
字段名 | 字段描述 |
country | 葡萄酒産地(國家) |
description | 對酒的評語(氣味,味道,外觀,感覺等) |
designation | 用于釀酒的葡萄産自哪個葡萄園 |
points | WineEnthusiast(葡萄酒愛好者雜志)對葡萄酒的評分(1~100) |
price | 價格 |
province | 葡萄酒産地(省/州) |
region_1 | 葡萄種植區_1 |
region_2 | 葡萄種植區_2(有可能為空) |
variety | 用于釀酒的葡萄種類 |
winery | 釀酒廠名 |
- 加載資料
#加載資料
import pandas as pd
reviews = pd.read_csv("data/winemag-data_first150k.csv", index_col=0)
reviews.head(3)
顯示結果: country | description | designation | points | price | province | region_1 | region_2 | variety | winery |
US | This tremendous 100% varietal wine hails from … | Martha’s Vineyard | 96 | 235.0 | California | Napa Valley | Napa | Cabernet Sauvignon | Heitz |
1 | Spain | Ripe aromas of fig, blackberry and cassis are … | Carodorum Selección Especial Reserva | 96 | 110.0 | Northern Spain | Toro | NaN | Tinta de Toro | Bodega Carmen Rodríguez |
2 | US | Mac Watson honors the memory of a wine once ma… | Special Selected Late Harvest | 96 | 90.0 | California | Knights Valley | Sonoma | Sauvignon Blanc | Macauley |
2.1 柱狀圖和分類資料
條形圖(柱狀圖)非常靈活: - 高度可以代表任何東西,隻要它是數字即可
- 每個條形可以代表任何東西,隻要它是一個類别即可。
- 條形圖是最簡單最常用的可視化圖表。 在下面的案例中,将所有的葡萄酒品牌按照産區分類,看看哪個産區的葡萄酒品種多:
# figsize 繪圖區域大小, fontsize 字型大小 color 顔色
text_kwargs = dict(
figsize=(16,8),
fontsize=20,
color=['b','orange','g','r','purple','brown','pink','gray','cyan','y']
)
# 計算省份出現次數,取前10,畫圖;**text_kwargs表示解包
reviews['province'].value_counts().head(10).plot.bar(**text_kwargs)
- 上面的圖表說明加利福尼亞生産的葡萄酒比其他省都多, 也可以折算成比例, 計算加利福尼亞葡萄酒占總數的百分比
# 計算省份出現次數,取前10,再分别除以資料的總數,就得到省份出産葡萄酒的占比
(reviews['province'].value_counts().head(10) / len(reviews)).plot.bar(**text_kwargs)
- 也可以用來展示《葡萄酒雜志》(Wine Magazine)給出的評分數量的分布情況:
# 計算所有不同評分的各自數量,再根據評分進行排序,再畫圖
reviews['points'].value_counts().sort_index().plot.bar(**text_kwargs)
2.2 折線圖
- 如果要繪制的資料不是類别值,而是連續值比較适合使用折線圖
- 柱狀圖和折線圖差別
- 柱狀圖:簡單直覺,很容易根據柱子的長短看出值的大小,易于比較各組資料之間的差别
- 折線圖:
- 易于比較各組資料之間的差别
- 能比較多組資料在同一個次元上的趨勢
- 每張圖上不适合展示太多折線
- 小練習:柱狀圖或折線圖
- 5種不同口味冰激淩,不同口味冰激淩的銷售數量。
- 國産轎車不同品牌的月銷售數量。
- 學生的考試分數,範圍為0-100
2.3 面積圖
- 面積圖就是在折線圖的基礎上,把折線下面的面積填充顔色;當隻有一個變量需要制圖時,面積圖和折線圖之間差異不大,在這種情況下,折線圖和面積圖可以互相替換
2.4 直方圖
# price小于200的所有資料df,取price列的值,畫圖
reviews[reviews['price'] < 200]['price'].plot.hist()
- 直方圖看起來很像條形圖。 直方圖是一種特殊的條形圖,它可以将資料分成均勻的間隔,并用條形圖顯示每個間隔中有多少行。 直方圖柱子的寬度代表了分組的間距,柱狀圖柱子寬度沒有意義。直方圖缺點:将資料分成均勻的間隔區間,是以它們對歪斜的資料的處理不是很好:
- 在第一個直方圖中,将價格>200的葡萄酒排除了
- 在第二個直方圖中,沒有對價格做任何處理,由于有個别品種的酒價格極高,導緻直方圖的價格分布發生變化
#檢視價格較高的葡萄酒情況
reviews[reviews['price'] > 1500]
顯示結果: country | description | designation | points | price | province | region_1 | region_2 | variety | winery |
13318 | US | The nose on this single-vineyard wine from a s… | Roger Rose Vineyard | 91 | 2013.0 | California | Arroyo Seco | Central Coast | Chardonnay | Blair |
34920 | France | A big, powerful wine that sums up the richness… | NaN | 99 | 2300.0 | Bordeaux | Pauillac | NaN | Bordeaux-style Red Blend | Château Latour |
34922 | France | A massive wine for Margaux, packed with tannin… | NaN | 98 | 1900.0 | Bordeaux | Margaux | NaN | Bordeaux-style Red Blend | Château Margaux |
- 資料傾斜:
- 當資料在某個次元上分布不均勻,稱為資料傾斜
- 一共15萬條資料,價格高于1500的隻有三條
- 價格高于500的隻有73條資料,說明在價格這個次元上,資料的分布是不均勻的
- 直方圖适合用來展示沒有資料傾斜的資料分布情況,不适合展示資料傾斜的資料
reviews.shape
顯示結果: 共計150930條資料
reviews[reviews['price'] >500].shape
顯示結果: 價格大于500的資料隻有73條 (73, 10)
- 對葡萄就的評分不存在資料傾斜的情況,評分資料的分布情況比較适合用直方圖展示
2.5 餅圖
- 餅圖的缺陷:餅圖隻适合展示少量分類在整體的占比
- 如果分類比較多,必然每個分類的面積會比較小,這個時候很難比較兩個類别
- 如果兩個類别在餅圖中彼此不相鄰,很難進行比較
- 可以使用柱狀圖圖來替換餅圖
3 Pandas 雙變量可視化
- 在上一小結中,介紹了使用Pandas繪圖,了解單個變量在資料中的互相關系,本小節會考察兩個變量如何進行可視化
- 資料分析時,我們需要找到變量之間的互相關系,比如一個變量的增加是否與另一個變量有關,資料可視化是找到兩個變量的關系的最佳方法
3.1 散點圖
- 最簡單的兩個變量可視化圖形是散點圖,散點圖中的一個點,可以表示兩個變量
# 價格小于100的葡萄酒,随機取樣100個資料,評分分布
reviews[reviews['price'] < 100].sample(100).plot.scatter(x='price', y='points')
- 調整圖形大小,字型大小,由于pandas的繪圖功能是對Matplotlib繪圖功能的封裝,是以很多參數pandas 和 matplotlib都一樣
from matplotlib import pyplot as plt
# 建立繪圖區域和坐标軸
fig, axes = plt.subplots(ncols=1, figsize=(20,10))
# 使用pandas 在指定坐标軸内繪圖
reviews[reviews['price'] < 100].sample(100).plot.scatter(x='price', y='points', figsize=(14,8), fontsize=16, ax=axes)
# 通過坐标軸修改标簽内容和字型大小
axes.set_xlabel('price', fontdict={'fontsize':16})
- 請注意,我們必須對資料進行采樣,從所有資料中抽取100條資料,如果将全部資料(15萬條)都繪制到散點圖上,會有很多點重疊在一起,不友善觀察
- 由于散點圖的缺點,是以散點圖最适合使用相對較小的資料集以及具有大量唯一值的變量。
- 有幾種方法可以處理過度繪圖。 一:對資料進行采樣 二:hexplot(蜂巢圖)
3.2 hexplot蜂巢圖
- hexplot将資料點聚合為六邊形,然後根據其内的值為這些六邊形上色: