可视化常见绘图(五)散点图

可视化常见绘图(五)散点图

一.散点图简介

散点图也叫 X-Y 图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。

通过观察散点图上数据点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。数据的相关关系主要分为:

  • 正相关(两个变量值同时增长)。

  • 负相关(一个变量值增加另一个变量值下降)。

  • 不相关。

  • 线性相关。

  • 指数相关。

散点图经常与回归线结合使用,归纳分析现有数据以进行预测分析。

对于那些变量之间存在密切关系,但是这些关系又不像数学公式和物理公式那样能够精确表达的,散点图是一种很好的图形工具。但是在分析过程中需要注意,这两个变量之间的相关性并不等同于确定的因果关系,也可能需要考虑其他的影响因素。

二.散点图的组成

一个标准的散点图至少包括以下几个部分:

  • 纵轴:表示其中一个变量的值

  • 横轴:表示其中一个变量的值

  • 点:(X,Y)

  • 回归线:最准确地贯穿所有点的线

三.应用场景

适合数据:两个连续数据字段的数据。

主要功能:观察数据的分布

适用数据条数:无限制。

备注:为了更好的观察数据分布,需要设置数据点的透明度或者是颜色。

适合场景

  • 显示和比较数值,不光可以显示趋势,还能显示数据集群的形状,以及在数据云团中各数据点的关系。

不适合场景

  • 显示各个分类数据的比例。

四.实现

matplotlib中使用scatter函数实现散点图,函数介绍如下:

scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,vmin=None, vmax=None, alpha=None, linewidths=None, *,edgecolors=None, plotnonfinite=False, data=None, **kwargs)

参数1:x,y:指定数据散点的坐标。

参数2:s:数值型,指定散点的大小。

参数3:c:数组或类数组型,指定散点的颜色。

参数4:marker:限定字符串,指定散点的标记类型(默认为:'o')。

参数5:cmap:指定所选用的colormap。

参数6:norm:未知。

参数7、8:min、vmax和norm配合使用用来归一化数据。

参数9:alpha:浮点型,指定散点的透明度。

参数10:linewidths:整数型,指定散点边缘的线宽;如果marker为None,则使用verts的值构建散点标记

参数11:verts:未知。

参数12:edgecolors:数组或类数组型,指定散点边缘颜色,会循环显示。

参数13:plotnonfinite:布尔型,结合 set_bad使用,指定是否是非限定式画点。

参数14:**kwargs:接受的关键字参数传递给Collection实例。

返回值:关联的PathCollection实例。

使用以SOCR-HeightWeight.csv数据集为例,该数据集一共记录了25000 个对象的身高体重,以身高为横轴,以体重为纵轴,查看两个变量之间的关系,完整代码如下:

import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression

import numpy as np

import pandas as pd

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置支持中文
plt.rcParams['axes.unicode_minus'] = False  # 设置-号
plt.style.use('seaborn-dark-palette')

df = pd.read_csv("SOCR-HeightWeight.csv", index_col=0)
height = df["Height(Inches)"].values.reshape(-1, 1)
weight = df["Weight(Pounds)"].values.reshape(-1, 1)

model = LinearRegression()
model.fit(height, weight)
coef = model.coef_[0]
intercept = model.intercept_[0]

height_avg = np.average(height)
weight_avg = np.average(weight)

quadrant1 = df[(df["Height(Inches)"] >= height_avg) & (df["Weight(Pounds)"] >= weight_avg)]
quadrant1_height = quadrant1["Height(Inches)"][:3000]
quadrant1_weight = quadrant1["Weight(Pounds)"][:3000]
plt.scatter(quadrant1_height, quadrant1_weight, alpha=0.3, label="散点图第一象限")

quadrant2 = df[(df["Height(Inches)"] <= height_avg) & (df["Weight(Pounds)"] >= weight_avg)]
quadrant2_height = quadrant2["Height(Inches)"][:3000]
quadrant2_weight = quadrant2["Weight(Pounds)"][:3000]
plt.scatter(quadrant2_height, quadrant2_weight, alpha=0.3, label="散点图第二象限")

quadrant3 = df[(df["Height(Inches)"] <= height_avg) & (df["Weight(Pounds)"] <= weight_avg)]
quadrant3_height = quadrant3["Height(Inches)"][:3000]
quadrant3_weight = quadrant3["Weight(Pounds)"][:3000]
plt.scatter(quadrant3_height, quadrant3_weight, alpha=0.3, label="散点图第三象限")

quadrant4 = df[(df["Height(Inches)"] >= height_avg) & (df["Weight(Pounds)"] <= weight_avg)]
quadrant4_height = quadrant4["Height(Inches)"][:3000]
quadrant4_weight = quadrant4["Weight(Pounds)"][:3000]
plt.scatter(quadrant4_height, quadrant4_weight, alpha=0.3, label="散点图第四象限")

# 画平均值
plt.hlines(weight_avg, min(height), max(height), ls="--", color='r', lw=2, label='体重平均值')
plt.vlines(height_avg, min(weight), max(weight), ls='--', color='k', lw=2, label='身高平均值')
x = np.arange(min(height), max(height), 0.05)
y = coef * x + intercept
plt.plot(x, y, lw=2, color="darkgray", label="身高体重回归线")
plt.title("身高体重散点图", fontsize=25, fontweight="bold")
plt.xlabel("身高(Inches)", fontsize=20)
plt.ylabel("体重(Pounds)", fontsize=20)
plt.legend(fontsize=15)
plt.show()

实现效果如下:

image.png

五.参考

  1. 堆叠图介绍

  2. 折线图

  3. 面积图

  4. 柱状图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容