(关系型数据的可视化)
散点图用于发现两个数值变量之间的关系
如果需要研究两个数值型变量之间是否存在某种关系,例如正向的线性关系,或者是趋势性的非线性关系,那么散点图将是最佳的选择。
matplotlib模块中的scatter函数可以非常方便地绘制两个数值型变量的散点图。这里首先将该函数的语法及参数含义写在下方,以便读者掌握函数的使用:
scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None,
vmax=None, alpha=None, linewidths=None, edgecolors=None)
import pandas as pd
import matplotlib.pyplot as plt
#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读入数据
iris = pd.read_csv(r'iris.csv')
# 绘制散点图
plt.scatter(x = iris.Petal_Width, # 指定散点图的x轴数据
y = iris.Petal_Length, # 指定散点图的y轴数据
color = 'steelblue' # 指定散点图中点的颜色
)
# 添加x轴和y轴标签
plt.xlabel('花瓣宽度')
plt.ylabel('花瓣长度')
# 添加标题
plt.title('鸢尾花的花瓣宽度与长度关系')
# 显示图形
plt.show()
如上图所示,通过scatter函数就可以非常简单地绘制出花瓣宽度与长度的散点图。如果使用pandas模块中的plot方法,同样可以很简单地绘制出散点图。
import pandas as pd
import matplotlib.pyplot as plt
#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读入数据
iris = pd.read_csv(r'iris.csv')
# Pandas模块绘制散点图
# 绘制散点图
iris.plot(x = 'Petal_Width',
y = 'Petal_Length',
kind = 'scatter', #scatter——散点图
title = '鸢尾花的花瓣宽度与长度关系')
# 修改x轴和y轴标签
plt.xlabel('花瓣宽度')
plt.ylabel('花瓣长度')
# 显示图形
plt.show()
结果:
尽管使用这两个模块都可以非常方便地绘制出散点图,但是绘制分组散点图会稍微复杂一点。如果读者使用seaborn模块中的lmplot函数,那么绘制分组散点图就太简单了,而且该函数还可以根据散点图添加线性拟合线。
为了使读者清楚地掌握lmplot函数的使用方法,有必要介绍一下该函数的语法和参数含义:
lmplot(x, y, data, hue=None, col=None, row=None, palette=None,
col_wrap=None, size=5, aspect=1, markers='o',
sharex=True, sharey=True, hue_order=None, col_order=None,
row_order=None, legend=True, legend_out=True, scatter=True,
fit_reg=True, ci=95, n_boot=1000, order=1, logistic=False,
lowess=False, robust=False, logx=False, x_partial=None,
y_partial=None, truncate=False, x_jitter=None, y_jitter=None,
scatter_kws=None, line_kws=None)
该函数的参数虽然比较多,但是大多数情况下读者只需使用几个重要的参数,如x、y、hue、data等。接下来仍以iris数据集为例,绘制分组散点图,绘图代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读入数据
iris = pd.read_csv(r'iris.csv')
# seaborn模块绘制分组散点图
sns.lmplot(x = 'Petal_Width', # 指定x轴变量
y = 'Petal_Length', # 指定y轴变量
hue = 'Species', # 指定分组变量
data = iris, # 指定绘图数据集
legend_out = False, # 将图例呈现在图框内
truncate=True # 根据实际的数据范围,对拟合线作截断操作
)
# 修改x轴和y轴标签
plt.xlabel('花瓣宽度')
plt.ylabel('花瓣长度')
# 添加标题
plt.title('鸢尾花的花瓣宽度与长度关系')
#设置横纵坐标的刻度范围
plt.xlim((0, 2.7)) #x轴的刻度范围被设为a到b
plt.ylim((0, 7.5)) #y轴的刻度范围被设为a'到b'
# 显示图形
plt.show()
结果:
注:setosa、versicolor、virginica是鸢尾花的不同种类
如上图所示,lmplot函数不仅可以绘制分组散点图,还可以对每个组内的散点添加回归线(上图默认拟合线性回归线)。分组效果的体现是通过hue参数设置的,如果需要拟合其他回归线,可以指定lowess参数(局部多项式回归)、logistic参数(逻辑回归)、order参数(多项式回归)和robust参数(鲁棒回归)。