什么是数据可视化?
数据可视化其实是将抽象概念进行形象性表达,将抽象语言进行具象图形可视的过程。数据可视化,不仅仅是统计图表。本质上,任何能够借助于图形的方式展示事物原理、规律、逻辑的方法都叫数据可视化。
可视化的目的是传播数据,因此需要花时间了解什么才是图表的基础,否则就是堆砌数字。
在python中有很多可视化工具,这里我们主要讲的是matplotlib。matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合进行交互式制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
matplotlib的最好的学习资源:matplotlib的示例库和官方文档,官网地址:https://matplotlib.org/
matplotlib
引入:
import matplotlib.pyplot as plt
【思考】为什么要引入pyplot模块?
matplotlib中许多我们用到的函数如plot,close等都位于matplotlib.pyplot模块中。
创建绘图对象:
plt.figure()
通过figsize参数可以指定绘图对象的宽度和高度,单位为英寸。
创建subplot对象:
fig.add_subplot(2,2,1)
#图像是2*2的,且当前选中的是四个subplot中的第一个。
plt.subplots()方法
#创建figure并返回一个含有已创建的subplot对象的numpy数组
plt.subplots()
参数 | 说明 |
---|---|
nrows | 行数 |
ncols | 列数 |
sharex | 所有subplot应该使用相同的x轴刻度 |
sharey | 所有subplot应该使用相同的y轴刻度 |
subplot_kw | 用于创建各subplot的关键字字典 |
**fig_kw | 创建figure时的其他关键字 |
subplots_adjust()方法
subplots_adjust(left=None,right=None,top=None,wspace=None,hspace=None)
#wspace和hpace控制宽度和高度的百分比,用于制作subplot之间的间距
颜色和线型
ax.plot(x,y,linestyle="--",color='g',marker='0')
刻度
修改刻度可以使用set_xticks和set_xticklabels.前者告诉matplotlib要将刻度放在数据范围的哪些位置,后者可以用来对其他任何的值用作标签。
ticks=ax.set_xticks([0,250,500,750,1000])
labels=ax.set_xticklabels['one','two','three','four','five'],
rotation=30,fontsize='small')
ax.set_xlabel('Stages') #为X轴摄制一个名称
ax.set_title('plot') #为图设置标题。
修改y轴的方法类似,不再赘述。
添加坐标轴
ax = plt.twinx() #twinx()可以为图增加纵坐标轴
ax2.set_ylabel("y2")
ax.set_ylabel("y2")
创建图例
ax.legend(loc='best')
添加注解
注解可以通过text,arrow,annotate等函数添加。
在这里插入代码片
图表的保存
plt.savefig('figpath.svg')
该方法相当于Figure对象的实例方法savefig。
文件类型是通过文件拓展名推断出来的。
参数 | 说明 |
---|---|
frame | 含有文件路径的字符串或python文件型对象。图像格式由文件拓展名推断得出,例如,.pdf推断出PDF,.png推断出PNG文件的分辨率。 |
dpi | 图像分辨率,默认为100 |
facecolor、edgecolor | 图像的背景色,默认为w |
format | 显示设置文件格式(‘png’,‘pdf‘’,‘svg’,‘ps’,‘eps’) |
bbox_inches | 图表需要保存的部分,如果设置为‘tight’,则尝试剪除图表周围的空白部分。 |
pandas中的绘图函数
如果使用matplotlib画图,可能需要一大堆的代码,而调用Pandas的plot()方法即可简单实现。
线型图
series和dataframe都有一个用于生成各类图表的plot方法,默认情况下他们生成的线性图。
s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()
pandas.Series.plot()的常见参数及说明如下:
参数 说明 | |
---|---|
label | 用于图例的标签 |
ax | 要在其上进行绘制的matplotlib subplot对象,如果没有设置,则使用当前matplotlib subplot |
style | 将要传给matplotlib的风格字符串,例如’ko-’ |
alpha | 图表的填充不透明(0-1) |
kind | 可以是’line’、‘bar’、‘barh’、‘kde’ |
logy | 在Y轴上使用对数标尺 |
use_index | 将对象的索引用作刻度标签 |
rot | 旋转刻度标签(0-360) |
xticks | 用作X轴刻度的值 |
yticks | 用作Y轴刻度的值 |
xlim | X轴的界限 |
ylim | Y轴的界限 |
grid | 显示轴网格线 |
Pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象,从而能够在网络布局中更为灵活地处理subplot的位置。DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例。
df = DataFrame(np.random.randn(10, 4).cumsum(0),
columns=['A', 'B', 'C', 'D'],
index=np.arange(0, 100, 10))
df.plot()
plt.show()
专用于DataFrame的plot的参数
参数 | 说明 |
---|---|
subplots | 将各个DataFrame列绘制到单独的subplots中 |
sharex | 如果subplots=true,则共用一个x轴,包括刻度和界限 |
sharey | 如果subplots=true,则共用一个y轴,包括刻度和界限 |
figsize | 表示图像大小的元组 |
title | 标题 |
legend | 添加一个图例 |
sort_columns | 以字母表顺序绘制各列,默认使用当前列顺序 |
柱状图
fig, axes = plt.subplots(2, 1)
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot(kind='bar', ax=axes[0], color='r', alpha=0.7)
data.plot(kind='barh', ax=axes[1], color='g', alpha=0.7)
plt.show()
DataFrame画柱状图:
df = DataFrame(np.random.rand(6, 4),
index=['one', 'two', 'three', 'four', 'five', 'six'],
columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df.plot(kind='bar') #图例
plt.figure()
df.plot(kind='barh', stacked=True, alpha=0.5)
plt.show()
- 对于DataFrame,柱形图会将每一行的值分为一组;
- DataFrame的各列名称都被用作了图例的标题;
- 设置stacked=True即可为DataFrame生成堆积柱形图,这样每行的值就会被堆积在一起。
柱状图有一个非常不错的用法:利用value_counts图形化显示Series中各值出现的频率,比如s.value_counts().plot(kind=‘bar’)
直方图和密度图
一种可以对值频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。
调用Series.hist()即可实现,在之后调用plot时加上参数kind='kde’即可生成一张密度图。
tips['tip_pct'].plot(kind='kde')
直方图和密度图往往会被画在一起,直方图以规格化形式给出(以便给出面元化密度),然后再在其上绘制核密度估计。
散布图
观察两个一维数据序列之间的关系的有效手段,研究两个变量的关系,特别是是否有线性或曲线相关性。matplotlib的scatter方法是绘制散布图的主要方法。利用plt.scatter()即可轻松绘制一张简单的散布图。
plt.scatter(trans_data['m1'],trans_data['unemp'])
pandas也提供了能从DataFrame创建散步图矩阵的scatter_matrix()方法,还支持在对角线上放置变量的直方图或密度图。
pd.scatter_matrix(trans_data,diagonal='kda',color='k',alpha=o.3)
饼图
df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])
df.plot(kind='pie', subplots=True, figsize=(8, 4))
df.plot(kind='pie', subplots=True,autopct='%.2f',figsize=(8, 4)) # 显示百分比
plt.show()
泰坦尼克案例分析
导入包
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
加载数据
text = pd.read_csv(r'result.csv')
可视化展示泰坦尼克号数据集中男女中生存人数分布情况
柱状图
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
plt.show()
饼状图
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.pie()
plt.title('survived_count')
plt.show()
可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例图
柱状图
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')
可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fare_sur
# 排序后绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fare_sur1
fig = plt.figure(figsize=(20, 18))
fare_sur1.plot(grid=True)
plt.legend()
plt.show()
可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况
# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur
sns.countplot(x="Pclass", hue="Survived", data=text)
可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况
facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况
text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
【思考题】
【思考1】最基本的可视化图案有哪些?分别适用于那些场景?(比如折线图适合可视化某个属性值随时间变化的走势)
- 散点图:用于发现各变量之间的关系。
- 柱状图:展示多个分类的数据变化和同类别各变量之间的比较情况。
- 条形图:展示多个分类的数据变化和同类别各变量之间的比较情况。
- 折线图:展示数据时间或有序类别的波动情况的趋势变化。
- 饼图:用来展示各类别占比,比如男女比例。
- 热力图:以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。
- 箱型图:用来展示一组数据分散情况,特别用于对几个样本的比较。
【思考2】计算出泰坦尼克号数据集中男女中死亡人数随,并可视化展示?如何和男女生存人数可视化柱状图结合到一起?看到你的数据可视化,说说你的第一感受(比如:你一眼看出男生存活人数更多,那么性别可能会影响存活率)。
代码在上面。
女生存活人数比男生多得多,说明性别在一定程度上会影响存活率。虽然女士体力上并不占优势,但是在实际情况下,许多男子会将生存的机会主动留个女子和儿童因此上面的数据是合理的。
隐隐约约get到第一次听红星老师分享时提到的一些观点了。这期task相对感觉没前面好学,主要还是对可视化太不熟悉了,还有就是task3当时学完(看懂)以后,到了这里又不太会用了,感觉学一点就卡。但是后来花时间把利用python进行数据分析关于可视化的部分看了一遍以后,感觉好学多了。然后把前面task3也稍微复习了一下,总算还是顺了一遍下来了。