数据可视化详解+代码演练
Posted 磐创AI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据可视化详解+代码演练相关的知识,希望对你有一定的参考价值。
作者 | Walker
编辑 | 磐石
出品 | 磐创AI技术团队
我们本篇文章讲的数据可视化是面向开发人员的,是利用python中一些可视化库如:matplotlib或是seaborn通过对数据可视化,来分析数据表格中各维度间的关系或是数据分布的特性,从而有助于我们更好的理解数据,帮助我们进行下一步数据分析或是为数据建模提供方向。本篇文章的方法并非是面向用户做数据展示或面向企业做数据可视化,这种情况下大家可以尝试使用Echarts或Tableau等数据展示工具。本文将分为matplotlib可视化和seaborn可视化两个部分。
一、Matplotlib数据可视化
Matplotlib是一个Python的2D绘图库,开发者使用Matplotlib仅需要几行代码便可以轻松绘图,生成柱状图、散点图、折线图、盒图、琴图等。
首先,matplotlib的安装非常的简单,Windows环境下我们可以通过pip install matplotlib直接完成安装,而Linux环境可以使用sudo pip install matplotlib完成安装。接着我们使用import matplotlib.pyplot as plt导入matplotlib库,便可以开始绘图了。
完整的绘图程序如下所示,包括图例、坐标轴、取值范围、刻度值、标题、注解等内容。
程序1:
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
# 定义数据部分
x = np.arange(0., 10, 0.2)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.sqrt(x)
# 绘制 3 条函数曲线
plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')
plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')
plt.plot(x, y3, color='m', linewidth=1.5, linestyle='-', marker='x', label=r'$y = \sqrt{x}$')
# 坐标轴上移
ax = plt.subplot(111)
ax.spines['right'].set_color('none') # 去掉右边的边框线
ax.spines['top'].set_color('none') # 去掉上边的边框线
# 移动下边边框线,相当于移动 X 轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 移动左边边框线,相当于移动 y 轴
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
# 设置 x, y 轴的取值范围
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)
# 设置 x, y 轴的刻度值
plt.xticks([2, 4, 6, 8, 10], [r'2', r'4', r'6', r'8', r'10'])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
[r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])
# 添加文字
plt.text(4, 1.68, r'$x \in [0.0, \ 10.0]$', color='k', fontsize=15)
plt.text(4, 1.38, r'$y \in [-1.0, \ 4.0]$', color='k', fontsize=15)
# 特殊点添加注解
plt.scatter([8,],[np.sqrt(8),], 50, color ='m') # 使用散点图放大当前点
plt.annotate(r'$2\sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))
# 设置标题、x轴、y轴
plt.title(r'$the \ function \ figure \ of \ cos(), \ sin() \ and \ sqrt()$', fontsize=19)
plt.xlabel(r'$the \ input \ value \ of \ x$', fontsize=18, labelpad=88.8)
plt.ylabel(r'$y = f(x)$', fontsize=18, labelpad=12.5)
# 设置图例及位置
plt.legend(loc='up right')
# plt.legend(['cos(x)', 'sin(x)', 'sqrt(x)'], loc='up right')
# 显示网格线
plt.grid(True)
# 显示绘图
plt.show()
散点图、曲线图、折线图、灰度图、饼状图、箱图、琴图等常用图形的绘制,也非常的简单,程序如下所示:
程序2:
#散点图,是用来展示两个维度间的相关性
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
plt.scatter(x,y)
程序3:
#曲线图,观察某个变量的走势
x = np.arange(-5,5,0.1)
y = x ** 2
plt.plot(x,y)y = np.random.normal(size=1000)
程序4:
#灰度图,查看某个维度的数据状况
x = np.random.normal(size=1000)
plt.hist(x, bins=100)
程序5:
#饼图,显示一个系列中各项的大小以及各项所占总和的比例
import numpy as np
import matplotlib.pyplot as plt
# x为数据, 根据数据在所有数据中所占的比例显示结果
# labels设置每个数据的标签
# autoper 设置每一块所占的百分比
# explode 设置某一块或者很多块突出显示出来, 由上面定义的explode数组决定
# shadow 设置阴影,这样显示的效果更好
labels = ["SH", "BI", "SZ", "GD"]
facts = [20, 10, 30, 40]
explode = [0, 0, 0.02, 0]
plt.axes(aspect = 1)
plt.pie(x = facts, labels = labels, explode= explode, shadow= True)
plt.show()
程序6:
#箱图
#上边缘(Q3+1.5IQR)、下边缘(Q1-1.5IQR)、IQR=Q3-Q1
#上四分位数(Q3)、下四分位数(Q1)
#中位数
#异常值
#处理异常值时与3σσ标准的异同:统计边界是否受异常值影响、容忍度的大小
plt.boxplot(y)
二、Seaborn数据可视化
Seaborn相较于matplotlib更加的方便、简单。因为Seaborn中自带了一些统计的包,它在画图的同时,会完成统计的拟合。而且Seaborn画图时的参数也更多,这样matplotlib可能很多行的代码,seaborn仅仅需要间的几行就能实现同样的效果。
Seaborn的安装也非常的简单,使用pip install seaborn直接安装即可,首先我们来介绍一些Seaborn中的基本绘图函数:折线图:plot()、散点图:lmplot()、柱状图:barplot()、联合分布图:jointplot()、琴图:violinplot()、箱式图:boxplot()、比较图:pairplot()等。常用的属性有hue:对数据按照不同的类型先做分组,再分别对每组数据绘图;col:用于多列数据都出现分组时;markers:用哪种符号对数据进行标注,Ci:是否开启置信区间;color、data、x、y等。
接下来我们通过两个案例来直观的比较一下seaborn和matplotlib的不同。
案例一:给定数据集航班乘客变化分析data = sns.load_dataset("flights"),利用柱状图分析乘客在一年中各月份的分布情况。
Matplotlib版本:
per_month_distribute = data.groupby('month').agg([np.mean, np.std])['passengers']
_,axe=plt.subplots()
plt.rcParams["figure.figsize"] = (12,8)
print(per_month_distribute)
plt.bar(range(12), per_month_distribute['mean'],color='cadetblue',label='average')
#yerr:y坐标对应误差的正负值,ls=linestyle,lw=linewidth
plt.errorbar(range(12), per_month_distribute['mean'],yerr=per_month_distribute['std'],ls='none',color='darkslategray', lw=5, label='error')
plt.xticks(range(12),per_month_distribute.index,fontsize=15,rotation=45)#把X轴上的字体旋转45度,以免重叠
plt.xlabel('Month of Year',fontsize=20)
plt.ylabel('Passengers',fontsize=20)
plt.legend([u"乘客量均值", u"乘客量标准差"],fontsize=15) #把label标注的内容显示出来
plt.title(u'乘客在一年中各月份的分布',fontsize=25)
axe.spines['top'].set_color(None)
axe.spines['right'].set_color(None)
plt.scatter(x,y)
Seaborn版本:
import seaborn as sns
sns.factorplot(x='month',y='passengers',data=data, kind='bar',size=8)
效果图:
案例二:给定数据集餐厅收取小费的情况:data = sns.load_dataset("tips"),绘制分组柱状图分析性别+抽烟的组合因素对慷慨度的影响。
Matplotlib版本:
tmp_data=data.groupby(['sex','smoker'])['tip'].agg([np.mean,np.std])
width = 0.2
_,axe=plt.subplots()
plt.bar([1,2],tmp_data['mean'].loc['Male'],width=width, label='Male')
plt.errorbar([1,2],tmp_data['mean'].loc['Male'],
yerr = tmp_data['std'].loc['Male'], ls ='none',lw=4,color='darkblue',label=None)
#画女性抽烟柱状图,X+0.2
plt.bar([x+width for x in [1,2]],tmp_data['mean'].loc['Female'],width=width,label='Female',color='salmon')
plt.errorbar([x+width for x in [1,2]],tmp_data['mean'].loc['Female'],
yerr=tmp_data['std'].loc['Female'],ls='none',lw=4,color='darkred',label=None)
plt.setp(axe, xticks=[1.1,2.1], xticklabels=['Yes','No']) #设置横坐标参数
plt.legend(fontsize=15)
plt.xlabel('Smoker',fontsize=15)
plt.ylabel('Tip',fontsize=15)
plt.axis([0.7,2.7,0,5]) #移动坐标轴,[left,right,bottom,top],距离左右,上下边框的距离
plt.title(u'性别+抽烟的组合因素对慷慨度的影响')
Seaborn版本:
sns.barplot(x='smoker',y='tip',data=tips,hue='sex')
效果图:
总结:通过上边的案例我们分别通过matplotlib和seaborn完成了数据可视化的操作,我么可以看到Seaborn封装的更好,使用起来更简单;但Matplotlib灵活性更高、功能也更加强大。学习Matplotlib和Seaborn更多的函数、图形的绘制,欢迎大家学习它们的官方手册,这里小编只是做了一个简单的常用整理。Matplotlib官方文档:http://www.matplotlib.org;
Seaborn官方手册:http://seaborn.pydata.org。
你也许还想看:
欢迎扫码进入相应技术交流群:
点击下方 | 阅读原文 | 了解更多
以上是关于数据可视化详解+代码演练的主要内容,如果未能解决你的问题,请参考以下文章
《Python数据可视化之matplotlib实践》 源码 第三篇 演练 第八章