一、基於Matplotlib的Pandas繪圖方法
Pandas繪制圖形相較於Matplotlib來說更為簡潔,基礎函數為df.plot(x,y)
例:
>>>df.plot('time','Money')
二、 基本數據圖形類型
通過kind可以設置圖形的類型,df.plot()默認繪制折線圖,df.plot(kind ='')用於設置各類圖形,如下表所示
參數 | 說明 |
x | x軸數據 |
y | y軸數據 |
kind | 設置圖表類型(具體可見右表) |
subplots | 判斷圖片是否有子圖 |
figsize | 圖片尺寸大小 |
label | 用於圖例的標簽 |
style | 設置風格,傳入字符串(如:'ko-') |
alpha | 設置透明度(越靠近0越透明) |
rot |
旋轉刻度標簽(rotation縮寫,取值0-360) |
fontsize |
設置軸刻度的字體大小 |
xticks | 用作x軸刻度的值 |
yticks | 用作y軸刻度的值 |
xlim | x軸的范圍 |
ylim | y軸的范圍 |
grid | 顯示刻度背景網格 |
colormap | 設置圖形顏色 |
layout | 設置子圖排列格式 |
參數kind | 圖形類型 |
line | 折線圖 |
bar/barh | 條形圖 |
hist | 直方圖 |
box | 箱線圖 |
scatter | 散點圖 |
pie | 餅圖 |
注意:若在繪制圖形時,對象是Series,那么Series對象的索引自動會設置為x軸,但是不會顯示刻度標簽
linestyle:設置線的樣式(簡寫:style)
marker:設置標記樣式
color:設置線的顏色(簡寫:c)
linewidth:設置顯得粗細(簡寫:lw)
樣式參數設置總結如下表:
三、條形圖
1、Series.plot(kind = 'bar')
Series繪制條形圖時,通常結合value_counts()顯示各值的出現頻率
除了傳入kind參數外,也可以簡寫為data.plot.bar()的形式,此類方法也適用於其他圖形。
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False data = pd.read_csv('C:/Users/xhl/Desktop/input/train_sample_utf8.csv') cg = data['分類'].value_counts() cg 汽車 544 科技 511 旅游 510 健康 492 文化 491 房地產 480 財經 469 新聞 458 體育 437 教育 437 娛樂 370 女人 322 Name: 分類, dtype: int64 #兩種繪圖方式均可 #cg.plot(kind='bar',rot=45) cg.plot.bar(rot=45) plt.xlabel('分類') plt.ylabel('頻數') plt.title('新聞分類分布條形圖')
2、DataFrame.plot.bar()
DataFrame繪制條形圖時,會將每一行的值分為一組,各列名稱作為圖例
df = pd.read_excel('C:/Users/xhl/Desktop/input/class.xlsx') df class sex score_math score_music 0 A male 95 79 1 A female 96 90 2 B female 85 85 3 C male 93 92 4 B female 84 90 5 B male 88 70 6 C male 59 89 7 A male 88 86 8 B male 89 74 df_class = df.groupby('class').mean() df_class score_math score_music class A 93.0 85.00 B 86.5 79.75 C 76.0 90.50 df_class.plot.bar()
3、堆積條形圖
設置參數stacked=True,每行的值就堆積起來,更易於觀察比較各組的分數
df_class.plot.barh(stacked=True)
四、直方圖
1、Series.plot.hist()
2、DataFrame.plot.hist()
通過bins設置面元,表示將數據分為多少組;
當有多種類型進行數據可視化時(堆疊情況發生時)可以設置透明度alpha,將數據的可視化更加明顯
df['score_math'].plot.hist(bins=20) df[['score_math','score_music']].plot.hist(bins=25,alpha=0.5)
默認畫的是頻數圖,如果想畫頻率圖,可以修改參數density
= True
調整參數cumulative
= True
繪制累積直方圖
3、繪制子圖
設置參數subplots=True,可將各列分布直方圖分別繪制在不同的子圖中
df.plot.hist(subplots=True,figsize = (7,5))
五、箱線圖
1、常規箱線圖
箱線圖是一種用作顯示數據分散情況的統計圖
用於考察數據之間的分布狀況,同時又用於考察數據之間的離散和分布程度,離散程度高表明數據之間的差異較大;
現繪制各科分數分布箱線圖:
color = dict(boxes='Green',whiskers='Orange',medians='Blue',caps='Gray') df.plot.box(color=color,sym='r+')//sym表示離群點 plt.title('各科分布情況箱線圖')
可以通過修改箱線圖的return_type
參數為dict
使得繪圖函數返回一個字典,這可以讓我們方便地從圖中提取一些數據。
>>> box = df.plot.box(color=color,sym='r+',return_type='dict') >>>box {'whiskers': [<matplotlib.lines.Line2D object at 0x00000186969E8DD8>, <matplotlib.lines.Line2D object at 0x00000186969F3438>, <matplotlib.lines.Line2D object at 0x00000186969BA5F8>, <matplotlib.lines.Line2D object at 0x00000186960D2C18>], 'caps': [<matplotlib.lines.Line2D object at 0x00000186969F3780>, <matplotlib.lines.Line2D object at 0x00000186969F3AC8>, <matplotlib.lines.Line2D object at 0x00000186969FDC88>, <matplotlib.lines.Line2D object at 0x00000186969FDFD0>], 'boxes': [<matplotlib.lines.Line2D object at 0x00000186969E8C88>, <matplotlib.lines.Line2D object at 0x00000186969FD4E0>], 'medians': [<matplotlib.lines.Line2D object at 0x00000186969F3E10>, <matplotlib.lines.Line2D object at 0x0000018696A09358>], 'fliers': [<matplotlib.lines.Line2D object at 0x00000186969F3EB8>, <matplotlib.lines.Line2D object at 0x0000018696A096A0>], 'means': []} >>> box.keys() dict_keys(['whiskers', 'caps', 'boxes', 'medians', 'fliers', 'means'])
其中:'boxes'對應的是箱體部分,'fliers'對應的是異常值點,'whiskers'對應的是兩條須,可以通過提取列表的第一個元素獲得相應的圖塊,然后使用get_xydata()獲取其對應的數據點
例:查看異常值部分,使用get_xydata()獲取對應的異常值
>>> box['fliers'][0].get_xydata() array([[ 1., 59.]])
2、水平箱線圖
通過vert = False可設置箱線圖為水平方向展示
color = dict(boxes='Green',whiskers='Orange',medians='Blue',caps='Gray') df.plot.box(color=color,sym='r+',vert=False) plt.title('各科分布情況箱線圖')
3、分組繪圖by
箱線圖也可以使用df.boxplot()的方法,設置參數by根據某列的唯一值將數據進行分組繪圖;子圖先列進行分組,然后按照班級分類進行分組(即子圖的個數 = 列的個數);當類別較多時,可以設定columns
,也就是要分析的列
如按照班級分組:
df.boxplot(by='class',sym='r+')
當boxplot
默認繪制了兩個標題時,可以通過suptitle
和title
進行調整,並設定grid
參數為False
不顯示刻度背景網格
4、分組繪圖groupby
使用df.groupby().boxplot()的方法,子圖先按照班級分類進行分組,然后每個子圖再按照各列進行分組(即子圖的個數 = 班級分類的個數)
df.groupby('class').boxplot(sym='r+',figsize=(7,5))
六、散點圖
1、基本散點圖
df.plot.scatter(x,y),繪制散點圖需要傳入參數x和y,分別設置x軸與y軸的數據。
基本的散點圖主要考察兩個散點圖之間的相互依存關系(相關關系)
df.plot.scatter(x = 'score_math',y = 'score_music') plt.title('math與music分數散點圖') plt.xlabel('math score') plt.ylabel('music score')
設置點的樣式:
s :設置點的大小
marker :設置點的形狀
c:設置點的顏色
df.plot(kind = 'scatter', x = 'score_math',y = 'score_music',c='g',marker='*',s=200)
說明:在散點圖的繪制過程中,有些數據可能會重疊,可通過設置透明度alpha解決此類問題,但是散點圖本就是分析趨勢,所以一般情況下問題不大。
2、加入影響因素(分類散點圖)
將班級等級進行數值編碼,並存與新列grade中:
df['grade'] = df['class'].replace(['A','B','C'],[3,2,1]) df.plot(kind = 'scatter', x = 'score_math',y = 'score_music',c='grade',figsize=(7,4))
注意:參數c既可以傳入顏色,也可以傳入列名,不同值的顏色會發生漸變
3、氣泡圖(散點圖的變種)
散點圖可用於展示三個變量(不是單純的三個變量之間的關系,數據分析一般☞分析兩兩量變量之間的關系)之間的關系,現使用氣泡圖的形式加入班級等級影響因素。
為了便於觀察,將grade的編碼替換為等比數列。
df['grade'] = df['grade'].replace([1,2,3],[1,2,4]) df.plot.scatter(x='score_math',y='score_music',figsize=(7,4),c='c',alpha=0.3,s=100*df['grade']) plt.title('math與music分數散點圖') plt.xlabel('math score') plt.ylabel('music score')
加入plt.colorbar(),可以給子圖添加colorbar(顏色條或漸變色條)
4、六邊箱圖
六邊箱圖又稱為高密度散點圖,df.plot.hexbin(),若數據點太密集,該圖效果優於散點圖
df.plot.hexbin(x='score_math',y='score_music',gridsize=20) plt.title('math與music分數六邊箱圖') plt.xlabel('math score') plt.ylabel('music score')
注意:其中參數gridsize用於設置x軸方向的六邊形數量,默認為100個,使用時根據自身需求進行調整
七、餅圖
查看某特征的分布情況,df.plot.pie()會自動添加標題和各部分的名稱
df['class'].value_counts().plot.pie()
如何去除默認文字、添加圖例、添加每部分百分比數值、設置凸出部分、添加陰影?
labels = None:可去除餅圖外側每部分的名稱;
plt.ylabel(''):設置y軸標簽為空可以去掉默認標題;
legend = True:添加圖例(或者plt.legend());
bbox_to_anchor:用來移動圖例的位置,其中0.9表示左右,0.8表示上下;
labels:表示顯示的圖例文字;
autopct:控制圖內百分比設置,'%%'的表示輸出一個百分號,前一個%是轉義字符;
explode:設置每一塊餅圖離開中心的距離,如將比重最大的一塊凸出;
shadow = True:添加陰影。
explode=(0.1,0,0)#0表示默認不離開 df['class'].value_counts().plot.pie(figsize=(5,5),labels=None, autopct='%.2f%%',fontsize=15, explode = explode,shadow = True) plt.ylabel('') plt.legend(bbox_to_anchor=[0.9,0.8],labels=['class B','class A','class C']) plt.title('班級分布餅圖')