一、关联图之散点图
第一章 关联图 Correlation
关联图是查找两个事物之间关系的图像,它能够为我们展示出一个事物随着另一个事物的变化如何变化
典型的关联图有:折线图,散点图,相关矩阵……
我们什么时候会需要关联图呢?
- 数据报告 & 学术研究:
展示趋势:比如产品销量随着时间如何变化,智力水平随着教育程度如何变化等
展现状态:不同年龄的客户的成交率,不同生产成本对应的生产员工技能要求 - 数据探索 & 数据解读:
探索数据关系,帮助了解事实,推动研究
- 统计学 & 机器学习:
探索数据关系,指导数据预处理和模型选择
散点图
1. 导入需要的绘图库
1 import numpy as np 2 import pandas as pd 3 import matplotlib as mpl 4 import matplotlib.pyplot as plt 5 import seaborn as sns 6 %matplotlib inline 7 #如果你在使用Jupyter Notebook,你会需要这样一句命令来让你的图像显示
2. 先来认识一下绘制散点图的函数
1 #绘制超简单的散点图:变量x1与x2的关系 2 3 #定义数据 4 x1 = np.random.randn(10) #取随机数 5 x2 = x1 + x1**2 - 10 6 7 #确定画布 - 当只有一个图的时候,不是必须存在 8 plt.figure(figsize=(8,4)) 9 10 #绘图 11 plt.scatter(x1,x2 #横坐标,纵坐标 12 ,s=50 #数据点的尺寸大小 13 ,c="red" #数据点的颜色 14 ,label = "Red Points" 15 ) 16 #装饰图形 17 plt.legend() #显示图例 18 19 plt.show() #让图形显示


1 #来试试看一个更加稍微难一些的:除了两列X之外,还有标签y的存在 2 #在机器学习中,我们经常有使用标签y作为颜色来观察两种类别的分布的需求 3 4 X = np.random.randn(10,2) #10行,2列的数据集 5 y = np.array([0,0,1,1,0,1,0,1,0,0]) 6 7 plt.figure(figsize=(8,4)) 8 9 plt.scatter(X[:,0],X[:,1] #横坐标,纵坐标 10 ,s=50 11 ,c=y #分类能够被可视化 12 ,label = ["Zero","One"] 13 ) 14 15 plt.legend() 16 plt.show()

【核心知识点】可视化分类标签时的图例
你是否注意到了?
如果我们希望显示多种颜色的散点图,并且这个颜色是我们的标签y所代表的分类,那我们无法让散点图显示分别代表不同颜色的图例
那我们应该怎么办呢?
colors = ["red","black"] #确立颜色列表 labels = ["Zero","One"] #确立标签的类别列表 for i in range(X.shape[1]): plt.scatter(X[y==i,0], X[y==i,1], c=colors[i], label = labels[i]) #在标签中存在几种类别,我们就需要循环几次,一次画一个颜色的点 plt.legend() plt.show()

现在我们只需要找到三个因素:
- 绘图用数据x1和x2
- 标签的列表
- 颜色
3. 开始认识绘图所需要的数据
颜色
接下来要创造和标签的类别一样多的颜色
如果只有三四个类别,或许我们还可以自己写
然而面对十几个,或者二十个分类,我们需要让matplotlib来帮助我们自动生成颜色
plt.cm.tab10()
用于创建颜色的十号光谱,在matplotlib中,有众多光谱供我们选择:https://matplotlib.org/tutorials/colors/colormaps.html
我们可以在plt.cm.tab10()中输入任意浮点数,来提取出一种颜色
光谱tab10中总共只有十种颜色,如果输入的浮点数比较接近,会返回类似的颜色
这种颜色会以元祖的形式返回,表示为四个浮点数组成的RGBA色彩空间或者三个浮点数组成的RGB色彩空间中的随机色彩
1 #导入数据 2 midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv")
1 #预设图像的各种属性 2 large = 22; med = 16; small = 12 3 params = {'axes.titlesize': large, #子图上的标题字体大小 4 'legend.fontsize': med, #图例的字体大小 5 'figure.figsize': (16, 10), #图像的画布大小 6 'axes.labelsize': med, #标签的字体大小 7 'xtick.labelsize': med, #x轴上的标尺的字体大小 8 'ytick.labelsize': med, #y轴上的标尺的字体大小 9 'figure.titlesize': large} #整个画布的标题字体大小 10 plt.rcParams.update(params) #设定各种各样的默认属性 11 plt.style.use('seaborn-whitegrid') #设定整体风格 12 sns.set_style("white") #设定整体背景风格 13 14 %matplotlib inline 15 16 #准备标签列表和颜色列表 17 categories = np.unique(midwest['category'])#去除重复项 18 colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]#创建好一个颜色的列表,然后使用索引来不断地将颜色提取出来 19 20 #建立画布 21 plt.figure(figsize=(16, 10) #绘图尺寸 22 , dpi=100 #图像分辨率 23 , facecolor='w' #图像的背景颜色,设置为白色,默认也是白色 24 , edgecolor='k' #图像的边框颜色,设置为黑色,默认也是黑色 25 ) 26 27 #循环绘图 28 for i, category in enumerate(categories): 29 plt.scatter('area', 'poptotal', 30 data=midwest.loc[midwest.category==category, :], 31 s=20, c=np.array(colors[i]).reshape(1,-1), label=str(category)) 32 33 #注意到这里的数据获取方法和我们刚才写的不同了吗? 34 #我们不仅可以输入横纵坐标,也可以输入横纵坐标的名字,然后使用data这个参数来传入全数据集 35 #我们不仅可以循环i,还可以对i和category一同进行循环 36 37 #对图像进行装饰 38 #plt.gca() 获取当前的子图,如果当前没有任何子图的话,就帮我创建一个新的子图 39 plt.gca().set(xlim=(0, 0.12), ylim=(0, 80000)) #控制横纵坐标的范围 40 plt.xticks(fontsize=12) #坐标轴上的标尺的字的大小 41 plt.yticks(fontsize=12) 42 plt.ylabel('Population',fontsize=22) #坐标轴上的标题和字体大小 43 plt.xlabel('Area',fontsize=22) 44 plt.title("Scatterplot of Midwest Area vs Population", fontsize=22) #整个图像的标题和字体的大小 45 plt.legend(fontsize=12) #图例的字体大小 46 plt.show()
标记需要注意的点:
1 plt.figure(figsize=(16, 10) #绘图尺寸 2 , dpi=60 #图像分辨率 3 , facecolor='w' #图像的背景颜色,设置为白色,默认也是白色 4 , edgecolor='k' #图像的边框颜色,设置为黑色,默认也是黑色 5 ) 6 7 #进行循环绘图 8 for i, category in enumerate(categories): 9 plt.scatter('area', 'poptotal', 10 data=midwest.loc[midwest.category==category, :], 11 s=20, c=np.array(plt.cm.tab10(i/float(len(categories)-1))).reshape(1,-1),label=str(category)) 12 13 #高学历,低贫困的地方 14 plt.scatter("area","poptotal", 15 data = midwest.loc[midwest.category == "HLU",:], 16 s=300, 17 facecolors="None", 18 edgecolors="red", 19 label = "Selected") 20 21 #低学历,很贫困的地方 22 #plt.scatter("area","poptotal", 23 # data = midwest.loc[midwest.category == "LHR",:], 24 # s=150, 25 # facecolors="None", #点的填充颜色,为None的时候,表示点是透明的 26 # edgecolors="red", #点的边框现在是红色 27 # label = "Selected") 28 29 #再试试看,高学历,高贫困的地方? 30 #学历低,但很富有的地方? 31 32 #对图像进行装饰 33 plt.gca().set(xlim=(0.0, 0.12), ylim=(0, 90000)) #控制横纵坐标的范围 34 plt.xticks(fontsize=12) #坐标轴上的标尺的字的大小 35 plt.yticks(fontsize=12) 36 plt.ylabel('Population',fontsize=22) #坐标轴上的标题和字体大小 37 plt.xlabel('Area',fontsize=22) 38 plt.title("Scatterplot of Midwest Area vs Population", fontsize=22) #整个图像的标题和字体的大小 39 plt.legend(fontsize=12) #图例的字体大小 40 plt.show()

浙公网安备 33010602011771号