DataJam

一、关联图之散点图

第一章 关联图 Correlation

 

关联图是查找两个事物之间关系的图像,它能够为我们展示出一个事物随着另一个事物的变化如何变化
典型的关联图有:折线图,散点图,相关矩阵……

 

我们什么时候会需要关联图呢?

  1. 数据报告 & 学术研究:

    展示趋势:比如产品销量随着时间如何变化,智力水平随着教育程度如何变化等
    展现状态:不同年龄的客户的成交率,不同生产成本对应的生产员工技能要求

  2. 数据探索 & 数据解读:

    探索数据关系,帮助了解事实,推动研究

  3. 统计学 & 机器学习:

    探索数据关系,指导数据预处理和模型选择

 

散点图

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()

 

 

现在我们只需要找到三个因素:

  1. 绘图用数据x1和x2
  2. 标签的列表
  3. 颜色

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()

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2021-06-01 14:42  DataJam  阅读(894)  评论(0)    收藏  举报

导航