在机器学习的过程中或者在数据分析过程中,难免要对数据进行探索,人是视觉动物,所以一般可视化的方法非常重要,但是对于各种图形怎么用,一直是没有什么概念,这次学习数据分析实战,有一讲专门讲数据可视化,刚好梳理下。
从图形化的方法来说,主要是为了展示分布(比如数据几种在哪里?) ,对比(两个变量或多个变量的关系),部分和整体的关系(比如圆饼图),联系(多个变量之间的关系)。
Matplotlib是python中常用的工具包,方便画图。seaborn 包是基于matplotlib图形可视化的python包,它提供一种高度交互的界面,提供高层次的API封装,使作图更加容易。
安装这个包比较容易:
#安装包并安装这个包需要依赖的包
pip install seaborn -U
散点图
散点图主要表达多个变量之间的联系,如果数据集中包含上千个点,散点图是比较好的图表类型。
- 可以看出点是分布是集中还是分散的。
- 变量之间是否存在数量关联趋势。
- 如果存在关联关系是线性还是曲线的。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Matplotlib画散点图
plt.scatter(x, y,marker='x')
plt.show()
# 用Seaborn画散点图
df = pd.DataFrame({'x': x, 'y': y})
#直方图
sns.jointplot(x="x", y="y", data=df, kind='scatter');
#带曲线的直方图
sns.jointplot(x="x", y="y", data=df, kind='reg');
plt.show()
折线图
折线图可以用来表示数据随着时间变化的趋势。
非常适用于显示在相等的时间间隔下的数据趋势,比如财务的月度报表,季度报表等。
matplotlib 和seaborn 画出来的差别不大
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Matplotlib画折线图
plt.plot(x, y)
plt.show()
# 使用Seaborn画折线图
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
复杂一点的折线图:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from numpy.random import randn
plt.style.use('ggplot')
plot_data1=randn(50).cumsum()
plot_data2=randn(50).cumsum()
plot_data3=randn(50).cumsum()
plot_data4=randn(50).cumsum()
fig=plt.figure(1,figsize=(10,8),facecolor="white")
ax=fig.add_subplot(1,1,1)
ax.spines["left"].set_color("white")
ax.spines["bottom"].set_color("white")
ax.plot(plot_data1,marker=r'o',markersize=4,markeredgecolor='black',color=u'blue',linestyle='-',label='Blue Solid')
ax.plot(plot_data2,marker=r'+',color=u'red',linestyle='--',label='Red Dash')
ax.plot(plot_data3,marker=r'*',color=u'green',linestyle='-.',label='Green Dash Dot')
ax.plot(plot_data4,marker=r's',color=u'orange',linestyle=':',label='Orange Dotted')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.title('Line Plots:Markers,Colors,and Linestyles')
plt.xlabel('Draw')
plt.ylabel('Random Number')
plt.legend(loc='best')
plt.grid()
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 构建 时间序列数据 从2000-1-31开始,以月份为间隔,构建100条记录
index = pd.date_range("1 1 2000", periods=100,freq="m", name="date")
data = np.random.randn(100, 4).cumsum(axis=0)
print(data)
# 构建5列数据,列名分别为data a b c d
wide_df = pd.DataFrame(data, index, ["a", "b", "c", "d"])
案例7:绘制时间序列数据
sns.lineplot(data=wide_df)
plt.show()
直方图
直方图是比较常见的视图,是一种统计报告图,由一系列高度不等的线段表示数据的分布,
直观显示数据的变化情况。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
a = np.random.randn(100)
s = pd.Series(a)
# 用Matplotlib画直方图
plt.hist(s)
plt.show()
# 用Seaborn画直方图
sns.distplot(s, kde=False)
plt.show()
sns.distplot(s, kde=False)
plt.show()
# 制定一些绘图参数
sns.distplot(s, rug=True, rug_kws={"color": "g"},
kde_kws={"color": "k", "lw": 3, "label": "KDE"},
hist_kws={"histtype": "step", "linewidth": 3,
"alpha": 1, "color": "g"})
plt.show()
条形图
通过条形图可以看到变量的数值分布,条形图可以帮我们查看类别的特征。
箱线图
箱线图又称盒式图,股市的走势就是直方图,由五个数值点组成:最大值(max),最小值(min),中位数(median)和上下四分位数(Q3,Q1)。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 数据准备
# 生成0-1之间的10*4维度数据
data=np.random.normal(size=(10,4))
lables = ['A','B','C','D']
# 用Matplotlib画箱线图
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn画箱线图
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()
饼状图
饼状图主要是说明整体和部分的关系。
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.pyplot as plt
# 数据准备
nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
# 用Matplotlib画饼图
plt.pie(x = nums, labels=labels)
plt.show()
热力图
热力图是由一组组方块组成,方块中用颜色的深浅来表示数值的大小,通过颜色判断数值的大小,颜色越浅,数值越大。
import matplotlib.pyplot as plt
import seaborn as sns
# 数据准备
flights = sns.load_dataset("flights")
data=flights.pivot('year','month','passengers')
# 用Seaborn画热力图
sns.heatmap(data)
plt.show()
参考
http://www.sohu.com/a/256123214_464033