Python数据分析—可视化数据

Python

# 一、可视化图表—单变量

可视化的作用不仅在于最后步骤。在数据分析前,图表能在我们自行探索数据的时候,帮助发现隐藏的关系、趋势、影响,高效找到下一步的分析方向。甚至在数据评估与清理步骤,可视化也能帮助我们直观发现异常数据。因此,数据可视化是一个万金油,它不仅是数据分析全流程中的一个步骤,更是一种方式,可以任何步骤里使用。

如果我们的数据包含一个数值变量,可以绘制直方图、密度图、箱型图、小提琴图。

# (一)、直方图

1、特点

展示数据的频率分布

2、表示

横轴表示某数据范围,而纵轴表示个数

# (二)、密度图(Kernel Density)

1、特点

同样用来表示数据的分布,更容易看出分布形状

2、不同

不同于直方图用一个个条柱表示频率,密度图会用一条平滑的曲线

纵轴表示的是概率密度,纵轴的最大值不会超过1

# (三)、箱型图

1、特点

看出中位数、上下四分位数、四分位距大小、分布是否对称、是否紧密,以及有没有异常值

2、表示

纵轴表示数据值;箱子的边界分别是第一和第三四分位数,所以箱子的长度就是四分位距;而箱子中间那条线是中位数;箱子上下的横线分别是上界和下界;上界和下界外的点是异常值。

3、上界&下界

上界 = (数据最大值 or 第三四分位数 + 1.5倍四分位距),其中的最小值

下界 = (数据最小值 or 第一四分位数 - 1.5倍四分位距),其中的最大值

如果有数据的值,(大于第三四分位数 + 1.5倍四分位距 or 小于第一四分位数 - 1.5倍四分位距),会被用单独的点表示出来,被算作异常值

# (四)、小提琴图

1、特点

能同时展现箱型图和密度图的信息

2、表示

中间的小圆点表示中位数;黑色条的边界和箱型图的箱子一样,分别是第一和第三四分位数;而小提琴的长度,表示95%置信区间;小提琴的体型,对应了密度图,越胖的地方那个值频率越高。

# 二、可视化图表—数据包含两个变量

如果我们的数据包含两个变量,比如两列DataFrame的话,可以绘制散点图、折线图、条形图、饼图。其中散点图和折线图,主要针对两个数值变量;条形图和饼图主要针对一个分类变量加一个数值变量。

# (一)、散点图

  1. 特点

可以从散点图,看出变量之间的相关性,比如是否相关、呈正比还是呈反比、线性还是非线性等等,也可以帮我们发现异常值的存在

  1. 表示

X轴表示一个变量的值,Y轴表示另一个变量的值

# (二)、折线图

  1. 特点

用于展示连续间隔或时间跨度上数值的变化,从而展示趋势变化

# (三)、条形图

  1. 特点

用来展示一个分类变量所对应的数值变量

  1. 条形图与直方图的不同
    • 直方图只针对一个数值变量,而条形图则是针对一个分类变量和一个数值变量
    • 直方图的各个条柱分隔除了不同的数字区间,而条形图的各个条柱分隔这不同的分类变量

# (四)、饼图

  1. 特点

用来展示各个分类对应的数值之间的比例,可以直观了解不同类别在整体中的占比

  1. 表示

每个圆弧的长度/面积,代表每个分类所占的百分比,全圆则表示所有分类占比的总和,也就是100%

# 三、可视化图表—数据包含多个变量

通过添加颜色或尺寸,在图表上表示新的变量

# (一)、散点图

  1. 2个数值变量,1个分类变量

如果要引入新的分类变量,可以把点绘制成不同的颜色,让颜色表示不同分类

  1. 气泡图,3个数值变量

如果要引入新的数值变量,可以把点绘制成不同的大小,让面积去表示不同数值

  1. 气泡图,3个数值变量,1个分类变量

把气泡绘制成不同的颜色

# (二)、折线图

  1. 2个数值变量,1个分类变量

可以绘制多条折线,不同颜色的折线代表不同分类

# (三)、条形图

  1. 复式条形图,2个分类变量,1个数值变量

绘制多个条柱,不同颜色的条柱代表不同分类

# (四)、热力图

2个分类变量,1个数值变量

  1. 特点

通过颜色来展示不同变量之间的数值差异

  1. 表示

横轴是分类变量,纵轴也是分类变量,每行或每列都表示一个分类种类,通过热力图里单元格的颜色或数值,表示数值变量数值的大小

通过把多个图放在一起,互相对比来挖掘信息

  1. 通过把两个直方图叠在一张图上,可以直观的看出,它们集中位置的差异、分散程度的差异等等
  2. 通过把多个小提琴图并排放,可以直观的比较它们的四分位距、密度概率等等

# 四、Seaborn和Matplotlib

用代码绘制包含一个变量的数据

绘制图表很多人会选择用Seaborn,并和Matplotlib配合使用

Seaborn

一个可视化库,操作简单,又广泛支持多种图表类型

Matplotlib

也是一个可视化库。Seaborn是基于Matplotlib实现的。Matplotlib虽然操作起来没有Seaborn简单,但是它更灵活和自由,所以让我们能对图表做各种自定义操作

# (一)、安装Seaborn

在CMD或终端,输入pip install seaborn

macOS有可能使用pip3 install seaborn

# (二)、安装Matplotlib

在CMD或终端,输入pip install matplotlib

macOS有可能使用pip3 install matplotlib

# (三)、导入Seaborn和Matplotlib

Matplotlib中大部分我们会用到的功能都在pyplot的子模块下

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
1
2
3
4
# 导入实例数据
df = sns.load_dataset('penguins').query('species == "Adelie"')
bill = df.bill_length_mm
bill
1
2
3
4
0      39.1
1      39.5
2      40.3
3       NaN
4      36.7
... 
147    36.6
148    36.0
149    37.8
150    36.0
151    41.5
Name: bill_length_mm, Length: 152, dtype: float64
1
2
3
4
5
6
7
8
9
10
11
12

# 五、绘制图表—对单个变量绘制图表

# (一)、对Series进行绘图

如果用Jupyter Notebook运行绘图函数的话,可以在输出里看到直方图;

如果在编辑器里运行的,需要调用Matplotlib的show函数,才能展示图片

# 1、直方图

英文是Histogram,Seaborn绘制直方图的函数叫做histplot

sns.histplot(bill) 

<Axes: xlabel='bill_length_mm', ylabel='Count'>
1
2
3

sns.histplot(bill)
plt.show()
1
2

# 2、密度图

统计学里密度叫做Kernel Density,Seaborn绘制密度图的函数叫kdeplot

sns.kdeplot(bill) 

<Axes: xlabel='bill_length_mm', ylabel='Density'>
1
2
3

# 3、箱型图

英文是Box Plot,Seaborn绘制箱型图的函数叫boxplot

sns.boxplot(bill)
plt.show()
1
2

# 4、小提琴图

英文是violin plot,Seaborn绘制小提琴图的函数叫violinplot

sns.violinplot(bill) 

<Axes: ylabel='bill_length_mm'>
1
2
3

# (二)、对DataFrame进行绘图

df
1
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
... ... ... ... ... ... ... ...
147 Adelie Dream 36.6 18.4 184.0 3475.0 Female
148 Adelie Dream 36.0 17.8 195.0 3450.0 Female
149 Adelie Dream 37.8 18.1 193.0 3750.0 Male
150 Adelie Dream 36.0 17.1 187.0 3700.0 Female
151 Adelie Dream 41.5 18.5 201.0 4000.0 Male

# 1、直接传入DataFrame

data=DataFrame,参数名'data='可以省略;然后参数x='X轴所对应列的列名',(y='Y轴所对应列的列名')

sns.histplot(df, x='bill_length_mm')
plt.show()
1
2

# 2、传入DataFrame的列

特别适用于,两个变量不属于同一DataFrame时

参数x=df1.列名a,(y=df2['列名b'])

sns.histplot(x=df['bill_length_mm'])
plt.show()
1
2

# (三)、给图表添加标题和轴标签

# 1、给图表添加标题

可以调用plt.title,里面传入标题字符串

# 2、给图表添加/更改轴标签

添加/更改X轴标签,可以调用plt.xlabel,里面传入标签字符串

添加/更改Y轴标签,可以调用plt.ylabel,里面传入标签字符串

标题和轴标签的添加,都需要在show函数被调用之前运行

Matplotlib当前默认的字体并不支持中文展示,所以我们需要把字体换成其它支持中文的字体。****由于每台电脑上有的字体并不相同,你可以先查询当前系统所有字体,然后把字体替换成其中某个支持中文的字体。

# 查询当前系统所有字体
import matplotlib
from matplotlib.font_manager import FontManager

# FontManager是matplotlib.font_manager中的一个类,FontManager()创建一个类实例,FontManager().ttflist返回FontManager类实例的ttflist属性,ttflist包含Matplotlib的字体列表
# set()和f.name部分是生成式表达式
mpl_fonts = set(f.name for f in FontManager().ttflist)
for f in sorted(mpl_fonts):
    print(f)
1
2
3
4
5
6
7
8
9
Agency FB
Algerian
Arial
Arial Rounded MT Bold
Bahnschrift
Baskerville Old Face
Bauhaus 93
Bell MT
Berlin Sans FB
Berlin Sans FB Demi
Bernard MT Condensed
Blackadder ITC
Bodoni MT
Book Antiqua
Bookman Old Style
Bookshelf Symbol 7
Bradley Hand ITC
Britannic Bold
Broadway
Brush Script MT
Calibri
Californian FB
Calisto MT
Cambria
Candara
Castellar
Centaur
Century
Century Gothic
Century Schoolbook
Chiller
Colonna MT
Comic Sans MS
Consolas
Constantia
Cooper Black
Copperplate Gothic Bold
Copperplate Gothic Light
Corbel
Courier New
Curlz MT
DejaVu Sans
DejaVu Sans Display
 DejaVu Sans Mono
 DejaVu Serif
 DejaVu Serif Display
 DengXian
 Dubai
 Ebrima
 Edwardian Script ITC
 Elephant
 Engravers MT
 Eras Bold ITC
 Eras Demi ITC
 Eras Light ITC
 Eras Medium ITC
 FZShuTi
 FZYaoTi
 FangSong
 Felix Titling
 Fences
 Footlight MT Light
 Forte
 Franklin Gothic Book
 Franklin Gothic Demi
 Franklin Gothic Demi Cond
 Franklin Gothic Heavy
 Franklin Gothic Medium
 Franklin Gothic Medium Cond
 Freestyle Script
 French Script MT
 Gabriola
 Gadugi
 Garamond
 Georgia
 Gigi
 Gill Sans MT
 Gill Sans MT Condensed
 Gill Sans MT Ext Condensed Bold
 Gill Sans Ultra Bold
 Gill Sans Ultra Bold Condensed
 Gloucester MT Extra Condensed
 Goudy Old Style
 Goudy Stout
 HGB1X_CNKI
 HGB1_CNKI
 HGB2X_CNKI
 HGB2_CNKI
 HGB3X_CNKI
 HGB3_CNKI
 HGB4X_CNKI
 HGB4_CNKI
 HGB5X_CNKI
 HGB5_CNKI
 HGB6X_CNKI
 HGB6_CNKI
 HGB7X_CNKI
 HGB7_CNKI
 HGB8X_CNKI
 HGB8_CNKI
 HGBD_CNKI
 HGBKBX_CNKI
 HGBKB_CNKI
 HGBKHX_CNKI
 HGBKH_CNKI
 HGBS1_CNKI
 HGBS2_CNKI
 HGBS_CNKI
 HGBTH_CNKI
 HGBTS_CNKI
 HGBX_CNKI
 HGBZ_CNKI
 HGCH_CNKI
 HGCUH_CNKI
 HGCY_CNKI
 HGDBS_CNKI
 HGDGY_CNKI
 HGDH2_CNKI
 HGDH_CNKI
 HGDYS_CNKI
 HGDY_CNKI
 HGF1X_CNKI
 HGF1_CNKI
 HGF2X_CNKI
 HGF2_CNKI
 HGF3_CNKI
 HGF4X_CNKI
 HGF4_CNKI
 HGF5X_CNKI
 HGF5_CNKI
 HGF6X_CNKI
 HGF6_CNKI
 HGF7X_CNKI
 HGF7_CNKI
 HGF8_CNKI
 HGF9X_CNKI
 HGF9_CNKI
 HGFS1_CNKI
 HGFS2_CNKI
 HGFSH_CNKI
 HGFS_CNKI
 HGFX_CNKI
 HGFZ_CNKI
 HGGG_CNKI
 HGH1X_CNKI
 HGH1_CNKI
 HGH2X_CNKI
 HGH2_CNKI
 HGH3X_CNKI
 HGH3_CNKI
 HGH4X_CNKI
 HGH4_CNKI
 HGH5X_CNKI
 HGH5_CNKI
 HGH6X_CNKI
 HGH6_CNKI
 HGH7X_CNKI
 HGH7_CNKI
 HGHB_CNKI
 HGHD_CNKI
 HGHP_CNKI
 HGHT1_CNKI
 HGHT2_CNKI
 HGHT_CNKI
 HGHUATI_CNKI
 HGHX_CNKI
 HGHZ_CNKI
 HGKT1_CNKI
 HGKT2_CNKI
 HGKT_CNKI
 HGKY_CNKI
 HGLB_CNKI
 HGLS_CNKI
 HGMH_CNKI
 HGNBS_CNKI
 HGOCR_CNKI
 HGPH_CNKI
 HGPTY_CNKI
 HGSS1_CNKI
 HGSS2_CNKI
 HGSS_CNKI
 HGSXT_CNKI
 HGTT_CNKI
 HGTX_CNKI
 HGWT_CNKI
 HGWYS_CNKI
 HGX1X_CNKI
 HGX1_CNKI
 HGXBS_CNKI
 HGXC_CNKI
 HGXF1_CNKI
 HGXFX_CNKI
 HGXFZ_CNKI
 HGXH1_CNKI
 HGXH_CNKI
 HGXK_CNKI
 HGXL_CNKI
 HGXS_CNKI
 HGXT_CNKI
 HGXY_CNKI
 HGY1_CNKI
 HGY2_CNKI
 HGY3_CNKI
 HGY4_CNKI
 HGYB_CNKI
 HGYT1_CNKI
 HGYT2_CNKI
 HGYT_CNKI
 HGYX_CNKI
 HGZCS_CNKI
 HGZDX_CNKI
 HGZK_CNKI
 HGZYT_CNKI
 HGZY_CNKI
 Haettenschweiler
 Harlow Solid Italic
 Harrington
 High Tower Text
 HoloLens MDL2 Assets
 Impact
 Imprint MT Shadow
 Informal Roman
 Ink Free
 Javanese Text
 Jokerman
 Juice ITC
 KaiTi
 Kristen ITC
 Kunstler Script
 Leelawadee UI
 LiSu
 Lucida Bright
 Lucida Calligraphy
 Lucida Console
 Lucida Fax
 Lucida Handwriting
 Lucida Sans
 Lucida Sans Typewriter
 Lucida Sans Unicode
 MS Gothic
 MS Outlook
 MS Reference Sans Serif
 MS Reference Specialty
 MT Extra
 MV Boli
 Magneto
 Maiandra GD
 Malgun Gothic
 Matura MT Script Capitals
 Microsoft Himalaya
 Microsoft JhengHei
 Microsoft New Tai Lue
 Microsoft PhagsPa
 Microsoft Sans Serif
 Microsoft Tai Le
 Microsoft YaHei
 Microsoft Yi Baiti
 MingLiU-ExtB
 Mistral
 Modern No. 20
 Mongolian Baiti
 Monotype Corsiva
 Myanmar Text
 Niagara Engraved
 Niagara Solid
 Nirmala UI
 OCR A Extended
 Old English Text MT
 Onyx
 Origin
 Palace Script MT
 Palatino Linotype
 Papyrus
 Parchment
 Perpetua
 Perpetua Titling MT
 Playbill
 Poor Richard
 Pristina
 Rage Italic
 Ravie
 Rockwell
 Rockwell Condensed
 Rockwell Extra Bold
 STCaiyun
 STFangsong
 STHupo
 STIXGeneral
 STIXNonUnicode
 STIXSizeFiveSym
 STIXSizeFourSym
 STIXSizeOneSym
 STIXSizeThreeSym
 STIXSizeTwoSym
 STKaiti
 STLiti
 STSong
 STXihei
 STXingkai
 STXinwei
 STZhongsong
 Sans Serif Collection
 Script MT Bold
 Segoe Fluent Icons
 Segoe MDL2 Assets
 Segoe Print
 Segoe Script
 Segoe UI
 Segoe UI Emoji
 Segoe UI Historic
 Segoe UI Symbol
 Segoe UI Variable
 Showcard Gothic
 SimHei
 SimSun
 SimSun-ExtB
 Sitka
 Snap ITC
 Stencil
 Sylfaen
 Symbol
 Tahoma
 Tempus Sans ITC
 Times New Roman
 Trebuchet MS
 Tw Cen MT
 Tw Cen MT Condensed
 Tw Cen MT Condensed Extra Bold
 Verdana
 Viner Hand ITC
 Vivaldi
 Vladimir Script
 Webdings
 Wide Latin
 Wingdings
 Wingdings 2
 Wingdings 3
 YouYuan
 Yu Gothic
 ZWAdobeF
 cmb10
 cmex10
 cmmi10
 cmr10
 cmss10
 cmsy10
 cmtt10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# 替换成Microsoft YaHei字体
# 调用的Matplotlib的rc函数,rc意思是'runtime configuration',rc函数可以配置各种Matplotlib的设置
matplotlib.rc("font",family='Microsoft YaHei')
1
2
3
sns.histplot(df, x='bill_length_mm')
plt.title('Adelie企鹅样本的嘴长度分布')
plt.xlabel('嘴长度(单位:mm)')
plt.ylabel('样本数量')
plt.show()
1
2
3
4
5

# 六、绘制图表—对两个变量绘制图表

通过Matplotlib和Seaborn,对两个变量绘制图表

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
1
2
3
4

# (一)、散点图

英文是Scatter Plot,Seaborn绘制散点图的函数叫做scatterplot

# 当本地没有此数据集,会自动从线上Seaborn数据库加载,Seaborn数据库数据集https://github.com/mwaskom/seaborn-data
df1 = sns.load_dataset('tips')
df1
1
2
3
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
sns.scatterplot(df1, x='total_bill', y='tip')
plt.show()
1
2

sns.scatterplot(x=df1.total_bill, y=df1['tip'])

<Axes: xlabel='total_bill', ylabel='tip'>
1
2
3

# (二)、折线图

英文是Line PlotSeaborn绘制折线图的函数叫做lineplot

df2 = sns.load_dataset('flights').query('month == "Jan"')
df2
1
2
year month passengers
0 1949 Jan 112
12 1950 Jan 115
24 1951 Jan 145
36 1952 Jan 171
48 1953 Jan 196
60 1954 Jan 204
72 1955 Jan 242
84 1956 Jan 284
96 1957 Jan 315
108 1958 Jan 340
120 1959 Jan 360
132 1960 Jan 417
sns.lineplot(x=df2.year, y=df2.passengers) 
<Axes: xlabel='year', ylabel='passengers'>
1
2

# (三)、条形图

英文是Bar PlotSeaborn绘制条形图的函数叫做barplot

默认情况下,条柱的高度对应所属分类下的所有值的平均值。如果希望展示其他聚合值,可选参数**estimator=聚合函数**

df3 = sns.load_dataset('penguins')
df3
1
2
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
... ... ... ... ... ... ... ...
339 Gentoo Biscoe NaN NaN NaN NaN NaN
340 Gentoo Biscoe 46.8 14.3 215.0 4850.0 Female
341 Gentoo Biscoe 50.4 15.7 222.0 5750.0 Male
342 Gentoo Biscoe 45.2 14.8 212.0 5200.0 Female
343 Gentoo Biscoe 49.9 16.1 213.0 5400.0 Male
sns.barplot(data=df3, x='species', y='body_mass_g') 
<Axes: xlabel='species', ylabel='body_mass_g'> 
1
2

sns.barplot(data=df3, x='species', y='body_mass_g', estimator=np.max) 
<Axes: xlabel='species', ylabel='body_mass_g'>
1
2

# (四)、计数图

如果希望条柱的高度对应个数,需要使用计数图。

英文是Count PlotSeaborn绘制计数图的函数叫做countplot

与条形图区别:只需要用一个分类变量绘制图表

sns.countplot(df3, x='species')
plt.show()
1
2

# (五)、饼图

Seaborn没有绘制饼图的函数,需要调用Matplotlib的pie函数

  1. 参数
  • 直接传入需要计算比例的Series,**DataFrame.列名1**,Matplotlib中的函数不支持传入整个DataFrame再指定变量
  • 指定标签,可选参数labels=DataFrame.列名2

标签与数据的个数和顺序都要对应

  • 显示比例数字标签, 可选参数autopct='文字格式',例:autppct='%.1f%%'
- autopct是用来设置每个扇形里文字标签格式的参数

- 文字格式要以`%`开头;`.1f`表示小数点后保留1位小数;`%%`表示数字标签要以'%'结尾,之所以用两个百分比符号,表示文字标签里的一个百分比,是因为程序需要区分于表示文字格式起始的一个百分比

- 以此类推,如果纸箱保留整数比例数字,可以改成`.0f`;如果想移除百分比符号,可以把格式字符串中,最后两个百分比符号去掉
1
2
3
4
5
  1. 大多数情况,数据集里没有各个类别数量的数据,需要自己获得
  • 对分类变量的Series,调用value_counts方法,会获得一个Series。这个Series可以直接传入pie函数中,labels=Series.index
  • df.groupby('分类变量')['无缺失值的列'].count(),会返回一个Series。这个Series可以直接传入pie函数中,labels=Series.index
# 设置示例数据
df4 = pd.DataFrame({'fruit': ['apple', 'orange', 'banana', 'pear'],
                    'vote': [32, 22, 19, 7]})
df4
1
2
3
4
fruit vote
0 apple 32
1 orange 22
2 banana 19
3 pear 7
plt.pie(df4.vote)
plt.show()
1
2

plt.pie(df4.vote, labels=df4.fruit, autopct='%.1f%%')
plt.show()
1
2

# (六)、更改图表颜色

许多绘图函数都支持color这个可选参数,color='颜色的英文'或者color='表示颜色的16进制值'

sns.scatterplot(x=df1.total_bill, y=df1['tip'], color='violet') 

<Axes: xlabel='total_bill', ylabel='tip'>
1
2
3

sns.histplot(data=df3, x="body_mass_g",
             color="#c287c7")
plt.show()
1
2
3

# (七)、更改图表色盘

适用于包含分类数据的图表,意思是更改一整套颜色主题

调用Seabornset_palette函数

sns.set_palette('crest')
sns.barplot(data=df3, x='species', y='body_mass_g')
1
2

sns.set_palette('pastel')
sns.barplot(data=df3, x='species', y='body_mass_g')
plt.show()
1
2
3

# 七、绘制图表—对多个变量绘制图表

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
1
2
3
4

通过Matplotlib和Seaborn,对多个变量绘制图表

# (一)、更改图例的位置

有时图例太长,会挡住图表里的元素,那我们可以把图例的位置进行更改。

调用Matplotliblegend函数,传入参数bbox_to_anchor=(横向位置, 纵向位置)

bbox_to_anchor会把图例放在图表的边框外面去。

元组第一个元素:放入0表示图例会在图表左边,1表示图表右边

元组第二个元素:放入0表示图例顶部和接近图表下边框的位置对齐,1表示图例顶部和接近图表上边框的位置对齐

sns.scatterplot(iris, x='sepal_length', y='sepal_width', hue='species', size='petal_length')
plt.legend(bbox_to_anchor=(1, 1))
plt.show()
1
2
3

# (二)、增加变量

# 1、给散点图增加变量

iris = sns.load_dataset('iris')
iris
1
2
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
sns.scatterplot(iris, x='sepal_length', y='sepal_width')
plt.show()
1
2

# 1)增加1个分类变量

可以传入可选参数hue='分类变量',散点图会根据不同变量把点画成不同的颜色

sns.scatterplot(iris, x='sepal_length', y='sepal_width', hue='species')
plt.show()
1
2

# 2)增加1个数值变量

通过添加颜色,表示不同数值

  • 可以传入可选参数hue='数值变量',深色和浅色分别表示大的数值和小的数值。
sns.scatterplot(iris, x='sepal_length', y='sepal_width', hue='petal_length')
plt.show()
1
2

通过添加尺寸,表示不同数值

  • 可以传入可选参数size='数值变量',通过点的大小表示数值,也即绘制了一个气泡图
sns.scatterplot(iris, x='sepal_length', y='sepal_width', size='petal_length')
plt.show()
1
2

# 3)增加1个分类变量,1个数值变量

可选参数hue='分类变量', size='数值变量'

用颜色表示种类,用点的大小表示数值,也即绘制了一个彩色气泡图

sns.scatterplot(iris, x='sepal_length', y='sepal_width', hue='species', size='petal_length')
plt.show()
1
2

# 2、给折线图增加变量

增加1个分类变量

可以传入可选参数hue='分类变量',让不同颜色的先分别代表不同变量

flights = sns.load_dataset('flights')
flights
1
2
year month passengers
0 1949 Jan 112
1 1949 Feb 118
2 1949 Mar 132
3 1949 Apr 129
4 1949 May 121
... ... ... ...
139 1960 Aug 606
140 1960 Sep 508
141 1960 Oct 461
142 1960 Nov 390
143 1960 Dec 432
sns.lineplot(x=flights.month, y=flights.passengers, hue=flights.year)
plt.legend(bbox_to_anchor=(1, 1))
plt.show()
1
2
3

# 3、给条形图增加变量

增加1个分类变量,变成复式条形图

可以传入可选参数hue='分类变量',让不同颜色的先分别代表不同变量

penguins = sns.load_dataset('penguins')
penguins
1
2
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
... ... ... ... ... ... ... ...
339 Gentoo Biscoe NaN NaN NaN NaN NaN
340 Gentoo Biscoe 46.8 14.3 215.0 4850.0 Female
341 Gentoo Biscoe 50.4 15.7 222.0 5750.0 Male
342 Gentoo Biscoe 45.2 14.8 212.0 5200.0 Female
343 Gentoo Biscoe 49.9 16.1 213.0 5400.0 Male
sns.barplot(penguins, x='species', y='body_mass_g', hue='sex')
plt.legend(bbox_to_anchor=(1, 1))
plt.show()
1
2
3

# 4、热力图

英文叫Heat Map,Seaborn绘制热力图的函数叫做heatmap

# 通过透视表导入示例数据
glue = sns.load_dataset('glue').pivot(index='Model', columns='Task', values='Score')
glue
1
2
3
Task CoLA MNLI MRPC QNLI QQP RTE SST-2 STS-B
Model
BERT 60.5 86.7 89.3 92.7 72.1 70.1 94.9 87.6
BiLSTM 11.6 65.6 81.8 74.6 62.5 57.4 82.8 70.3
BiLSTM+Attn 18.6 67.6 83.9 74.3 60.1 58.4 83.0 72.8
BiLSTM+CoVe 18.5 65.4 78.7 70.8 60.6 52.7 81.9 64.4
BiLSTM+ELMo 32.1 67.2 84.7 75.5 61.1 57.4 89.3 70.3
ERNIE 75.5 92.3 93.9 97.3 75.2 92.6 97.8 93.0
RoBERTa 67.8 90.8 92.3 95.4 74.3 88.2 96.7 92.2
T5 71.6 92.2 92.8 96.9 75.1 92.8 97.5 93.1
sns.heatmap(glue) 

<Axes: xlabel='Task', ylabel='Model'>
1
2
3

如果要在格子上把对应数值作为标签进行展示的话,传入可选参数annot=True,annot是annotation的简写

sns.heatmap(glue, annot=True) 
<Axes: xlabel='Task', ylabel='Model'>
1
2

# (三)、图上绘制多个图表

# 1、图上绘制多个直方图

setosa = iris.query('species == "setosa"')
versicolor = iris.query('species == "versicolor"')
virginica = iris.query('species == "virginica"')
1
2
3
# 1)图上绘制多个直方图

调用多次histplot函数,最后plt.show展示出来的图片里,多个直方图就都在里面了

sns.histplot(setosa.petal_length)
sns.histplot(versicolor.petal_length)
sns.histplot(virginica.petal_length)
plt.show()
1
2
3
4

# 2)统一条柱宽度

由于调用多次histplot函数进行绘制的时候,条柱是按照各自适合的粗细画的,我们只是把它们放到了同一张图上,所以会导致条柱的粗细不统一。

所以我们需要在调用histplot函数进行绘制的时候,指定条柱宽度。传入可选参数binwidth=数值间距

sns.histplot(setosa.petal_length, binwidth=0.1)
sns.histplot(versicolor.petal_length, binwidth=0.1)
sns.histplot(virginica.petal_length, binwidth=0.1)
plt.show()
1
2
3
4

# 3)设置图例

另外一个问题是,这个图片没有图例,无法分清哪个颜色对应哪个种类。

为了解决这个问题,我们可以在调用histplot函数进行绘制时,传入可选参数label="标签";然后需要调用下plt.legend(),手动让图例展示出来

sns.histplot(setosa.petal_length, binwidth=0.1, label='Setosa')
sns.histplot(versicolor.petal_length, binwidth=0.1, label='Versicolor')
sns.histplot(virginica.petal_length, binwidth=0.1, label='Virginica')
plt.legend()
plt.show()
1
2
3
4
5

# 2、图上绘制多个密度图

图上绘制多个密度图与直方图是一样的步骤,唯一的区别是因为密度图是一条平滑的曲线,所以我们不需要可选参数binwidth去指定条柱的宽度了

sns.kdeplot(setosa.petal_length, label='Setosa')
sns.kdeplot(versicolor.petal_length, label='Versicolor')
sns.kdeplot(virginica.petal_length, label='Virginica')
plt.legend()
plt.show()
1
2
3
4
5

# 3、图上绘制多个箱型图/小提琴图

如果和直方图及密度图一样,在图上绘制多个箱型图/小提琴图,这样它们会都挤在同一条纵线上,因为和前面不同的是,这次横轴并不表示数值

sns.boxplot(setosa.petal_length)
sns.boxplot(versicolor.petal_length)
sns.boxplot(virginica.petal_length)
plt.show()
1
2
3
4

sns.violinplot(setosa.petal_length)
sns.violinplot(versicolor.petal_length)
sns.violinplot(virginica.petal_length)
plt.show()
1
2
3
4

这种情况下,更好的选择是,通过添加坐标轴,在图表上表示分类变量。传入可选参数x='分类变量'

sns.boxplot(iris, y='petal_length', x='species')
plt.show()
1
2

sns.violinplot(iris, y='petal_length', x='species')
plt.show()
1
2

总之,当我们想在图上表示多个变量的时候,要根据图表的具体种类选择合适的操作方法。

# (四)、图上绘制多个子图

除了把不同图形放到同一个图里,还有的时候我们是想把单独的图,并排放在一起,这样的话可以让图表排版得更加紧密,因为默认的情况下,Seaborn一行只会放一张图

# 1、图上绘制多个子图

需要用Matplotlibsubplots函数,plt.subplot(行数, 列数)

plt.subplots(1, 3)
plt.show()
1
2

# 2、指定子图的宽和高

传入可选参数figsize=(宽, 高)

plt.subplots(1, 3, figsize=(15, 5))
plt.show()
1
2

# 3、把图表画进空白的子图

  • subplots返回的结果,赋值为figaxes两个变量,fig对应整个大图,而axes对应一系列子图,所以我们主要用到的是axes
  • 正常调用绘图函数,调用绘图函数时,传入可选参数ax=axes[n]
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
sns.boxplot(iris, y='sepal_length', x='species', ax=axes[0])
sns.boxplot(iris, y='sepal_width', x='species', ax=axes[1])
sns.boxplot(iris, y='petal_length', x='species', ax=axes[2])
plt.show()
1
2
3
4
5

# (五)、配对图

Seabornpairplot函数,传入DataFrame后,它会把数据里面数值变量之间的,所有两两关系都绘制出来,一共得到N*N个图,N表示传入DataFrame里数值变量的个数。

具体来说,它会把各变量的分布用直方图绘制出来,然后把不同变量两两之间的关系绘制成散点图,所以非常适合一次性探索变量分布,以及不同变量之间的关系

sns.pairplot(iris)
plt.show()
1
2

也可以传入可选参数hue='分类变量',因此可以一次性对比不同分类变量的数值关系

sns.pairplot(iris, hue='species')
plt.show()
1
2


数据可视化环节,可以用在数据分析流程的方方面面

  1. 清洗环节

可以通过绘制箱型图来寻找异常值的存在,然后根据具体情况考虑是否删除异常值,

  1. 假设检验之前

可以先通过直方图或密度图查看它们之间的关系,对比差异从图上来看是否显著,然后再进行科学化的数值检验

  1. 绘制图表本身也是一种探索数据、分析数据的方式
最近修改于: 2024/12/11 00:42:40
和宇宙温柔的关联
房东的猫