数据可视化是数据分析中最重要的工作之一。在数据探索阶段,可视化有助于我们了解数据的基本分布与简单规律;在数据分析结果阶段,可视化呈现的结果更加直观、醒目。按照数据之间的关系,我们可以把可视化视图分为四类:比较、联系、构成和分布。数据之间表现的这四种关系主要特点如下:
比较:比较数据间各类别的关系,或者是它们随时间的变化趋势,比如折线图;
联系:查看两个或两个以上变量之间的关系,比如散点图;
构成:每个部分占整体的百分比,或者是随时间的百分比变化,比如饼图;
分布:关注单个变量,或者多个变量的分布情况,比如直方图与散点图。
matplotlib
seaborn
创建图像对象
使用figure函数来创建
输入数据参数
导入数据
在窗口里面绘图与标记内容
线条粗细、颜色、形状、横坐标纵坐标等等
>>> import matplotlib.pyplot as plt # 载入matplotlib的子模块pyplot>>> fig = plt.figure(figsize=(10,8)) # 指定图像大小与纵横比
其中 figsize=(10,8) 是用来指定图像的大小与纵横比,下面以折线图为例,来介绍 matplotlib 中常用的命令与步骤
>>> input_value = [1,2,3,4,5] # 输入值>>> squares = [1,4,9,16,25] # 输出值>>> plt.plot(input_value,squares,linewidth=5) # 设置线条的粗细>>> plt.title("Square Numbers",fontsize=24) # 给图表指定标题>>> plt.xlabel("Value ",fontsize=14) # 为x轴设置标题>>> plt.ylabel("Square of value",fontsize=14) # 为y轴设置标题>>> plt.tick_params(axis='both',labelsize=12) # 设置刻度标记大小>>> plt.show() # 打开 matplotlib 查看器
最终得到的图像如下所示。注意,
pyplo
t模块的
plo
t函数可以接收其他参数,如线条粗细、颜色、线条形状等。
plo
t 函数里面常用的关键字参数如下:
plt.plot(x,y,color='green',marker='o',linestyle='dashed',linewidth=1,markersize=6)# (x,y):横坐标与纵坐标的w位置# color:颜色参数# marker:数据点形状参数# linestyle:线型参数,包括:虚线、实现或点线# linewidth: 线条粗细参数# markersize: 数据点大小参数
如果需要在一个窗口同时画几个不同的子图,可以利用 Matplotlib 的如下命令来实现:
>>> import numpy as np>>> x = np.random.randint(1,10,8) # 从均匀分布随机抽取8个数据>>> label = list('abcdefgh') # 对上述8个数据标记字母>>> plt.subplot(211) # 指定2行1列第1个子图0x09705290>>>> plt.bar(label,x) # 在指定的子图上绘制垂直柱状图8 artists>>>> plt.subplot(212) # 指定2行1列第2个子图0x0B8140F0>>>> plt.barh(label,x) # 在指定的子图上绘制水平柱状图8 artists>>>> plt.show()
注意,垂直柱状图用 plt.bar() ,水平柱状图用 plt.barh() ,图像如下所示:
利用
pyplot 绘制直方图的命令格式如下:
plt.hist(data,bins=40,normed=0,facecolor="blue",edgecolor="black",alpha=0.7)# data 必选参数,绘图数据# bins 直方图的长条形数目,可选项,默认为0# normed 直方图向量是否进行归一化,默认为0代表不归一化,显示频数# normed=1 1表示归一化,显示频率# facecolor 长条形的颜色# edgecolor 长条形边框的颜色# alpha 透明度
下面以具体的实例来说明如何绘制直方图:
>>> import matplotlib>>> import numpy as np>>> # 设置matplotlib 正常显示中文和负号>>> matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文>>> matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号>>> data = np.random.randn(10000) # 随机生成10000个服从正态分布的数据>>> len(data)10000>>> plt.hist(data,bins=40,normed=0,facecolor="blue",edgecolor="black",alpha=0.7)>>> plt.xlabel("区间") # 显示横轴标签>>> plt.ylabel("频数/频率") # 显示纵轴标签>>> plt.title("频数/频率分布直方图") # 显示图标题>>> plt.show() # 显示图像
箱形图
boxplot以一种相对稳定的方式描述数据的离散分布情况,箱形图最大的有点就是不受异常值的影响。从箱形图中可以清晰的看出异常值是否存在,中位数与平均值的差异。在Python中画箱形图,以
matplotlib 结合
seaborn 的方式使得编写代码简洁、绘图更有美感。
>>> import matplotlib.pyplot as plt>>> import seaborn as sns>>> iris = sns.load_dataset("iris")>>> sns.boxplot(x=iris['species'],y=iris['sepal_width'])>>> plt.show() # 显示图像
图像如下:
热点图
heatmap 作为一种密度图,热力图一般使用具备显著颜色差异的方式来呈现数据效果,热力图中亮色一般代表时间发生频率较高或事物分布密度较大,暗色则反之。
import matplotlib.pyplot as pltimport seaborn as sns# Load the example flights dataset and convert to long-formflights_long = sns.load_dataset("flights")flights = flights_long.pivot("month", "year", "passengers")# Draw a heatmap with the numeric values in each cellf, ax = plt.subplots(figsize=(9, 6))sns.heatmap(flights, annot=True, fmt="d", linewidths=.5, ax=ax)
Pairplot 主要展现的是变量两两之间的关系(线性或非线性,有无明显的相关关系)
import matplotlib.pyplot as pltimport seaborn as snsiris = sns.load_dataset("iris")sns.pairplot(iris)
对角线上是各个属性的直方图(分布图),而非对角线上是两个不同属性之间的相关图,从图中我们发现,花瓣的长度和宽度之间以及萼片的长短和花瓣的长、宽之间具有比较明显的相关关系。