matplotlib之散点图

文章目录

  • 散点图
  • scatter函数
    • 1、函数定义:
    • 2、scatter的详细定义:
  • 示例说明:
    • 1)正相关
    • 2)负相关
    • 3)不相关
  • 扩展应用:
    • 1、添加图列
    • 2、标记点符号
    • 3、三维散点图
    • 4、添加边界
    • 5、散点直方图
  • 总结


散点图

Scatter chart(PointGraph, X-Y Plot, Scatter Chart或者 Scattergram)是绘图中最常见的图形类型之一,通常用于显示和比较数值。散点图是使用一系列的散点在直角坐标系中展示变量的数值分布。在二维散点图中,可以通过观察两个变量的数据分析,发现两者的关系与相关性。

散点图可以提供三类关键信息

  • 变量之间是否存在数量关联趋势(正相关,负相关,不相关等);
  • 如果存在关联趋势,是线性还是非线性的;
  • 观察是否有存在离群值,从而分析这些离群值对建模分析的影

scatter函数

1、函数定义:

在向量 x 和 y 指定的位置创建一个包含圆形的散点图,该类型的图形也称为气泡图。

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=<deprecated parameter>, edgecolors=None, \*, plotnonfinite=False, data=None, \*\*kwargs)

常用参数:

  • x,y:

x轴 和 y 轴对应的数据。根据x和y的值,在二维平面对应位置创建一个包含圆形的散点图

  • s:

散点标记面积,以平方磅为单位的标记面积。可以为标量或者等长的数组。

  • c:

散点标记的颜色,为指定的色彩、数值序列或者颜色序列。

  • marker:

散点标记类型,默认为圆圈。

  • cmap:

仅当c参数为颜色序列的时候使用。

  • aplha:

透明图设置,在显示多个变量的场景下为了能够显示堆叠的散点,可以设置该参数。取值范围[0,1]。0:透明,1:不透明。

  • norm:

仅当c为数值序列的时候,通过colors.Normalize将值进行正则化。

  • linewidths:

散点标记的边界的宽度。

  • edgecolors:

散点标记的边界的颜色。

2、scatter的详细定义:

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter

示例说明:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)

#根据x,y生成一个数列,将对应的数据点映射到coclarmap中的颜色上
C = np.arctan(X/Y)
'''
s:大小固定设置为64
c:通过arctan函数随机生成一个数列,映射到coloarmap的颜色上
makrer:散点标记类型设置为‘o’对应圆圈
aplpha:透明度设置为0.5,重合部分可以正常显示
linewidths:为散点标记的边界宽度
edgecolors:散点边界的点色,“w”为白色
'''
plt.scatter(X,Y, s=64, c=C, marker='o',alpha=.5,linewidths=2,edgecolors='w')

plt.xlim(-1.5,1.5)
plt.ylim(-1.5,1.5)
# savefig('../figures/scatter_ex.png',dpi=48)
plt.show()

运行结果
matplotlib之散点图_第1张图片
不同关联趋势的示例

1)正相关

import matplotlib.pyplot  as plt
import numpy as np

N =500

#randn函数返回N组样本,具有标准正态分布
x = np.random.randn(N)
# y = x + k
y = x + np.random.randn(N)*0.2
'''
s:大小固定设置为64
c:通过arctan函数随机生成一个数列,映射到coloarmap的颜色上
makrer:散点标记类型设置为‘o’对应圆圈
aplpha:透明度设置为0.5,重合部分可以正常显示
linewidths:为散点标记的边界宽度
edgecolors:散点边界的点色,“w”为白色
'''
C = np.arctan(x/y)
plt.scatter(x,y,s=64,c=C ,marker='o',alpha=.5,linewidths=2,edgecolors='w')
plt.show()

运行结果:
matplotlib之散点图_第2张图片

2)负相关

import matplotlib.pyplot  as plt
import numpy as np

N =500

#randn函数返回N组样本,具有标准正态分布
x = np.random.randn(N)
# y = -x + k
y = -x + np.random.randn(N)*0.2

plt.scatter(x,y,marker='o',alpha=.5,linewidths=2,edgecolors='w')
plt.show()

运行结果:
matplotlib之散点图_第3张图片

3)不相关

import matplotlib.pyplot  as plt
import numpy as np

N =500

#randn函数返回N组样本,具有标准正态分布
x = np.random.randn(N)

y = np.random.randn(N)

plt.scatter(x,y,marker='o',alpha=.5,linewidths=2,edgecolors='w')
plt.show()

matplotlib之散点图_第4张图片

扩展应用:

1、添加图列

通过legend_elements()函数根据size和color给散点图增加图例。


import numpy as np
import matplotlib.pyplot as plt
#其中(10, 10)用于控制图片的大小
plt.figure(figsize=(10,10))
N=50
x, y = np.random.rand(2, N)
c = np.random.randint(1, 4, size=N)
s = np.random.randint(10, 100, size=N)

fig, ax = plt.subplots()
scatter = ax.scatter(x, y, c=c, s=s)

# 按照散点图中标记的colors生成legend
legendClass = ax.legend(*scatter.legend_elements(prop="colors"),
                    loc="lower left", title="classes")
ax.add_artist(legendClass)

# 按照散点图中标记的size生成legend
handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6,num=5)
legendSize = ax.legend(handles, labels, loc="upper right", title="Sizes")
ax.add_artist(legendSize)

plt.show()

运行结果:
matplotlib之散点图_第5张图片

2、标记点符号

marker 可以使用的符号如下
matplotlib之散点图_第6张图片

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.pyplot  as plt
import numpy as np

N =500

#randn函数返回N组样本,具有标准正态分布
x = np.random.randn(N)

y = np.random.randn(N)
#使用菱形标记点
plt.scatter(x,y,marker='D',alpha=.8,linewidths=2,edgecolors='w')
plt.show()

运行结果:
matplotlib之散点图_第7张图片

3、三维散点图

三维散点图就是在由3个变量确定的三维空间中研究变量之间的关系,由于同时考虑了3个变量,常常可以发现在两维图形中发现不了的信息。

import numpy as np
import matplotlib.pyplot as plt

#其中(20, 50)用于控制图片的大小
fig = plt.figure(figsize=(20,50))
#projection = '3d' 指定为三维坐标
ax = fig.add_subplot(111, projection='3d')

x = np.arange(0, 200)
y = np.arange(0, 100)
#np.meshgrid生成网格点坐标矩阵
x, y = np.meshgrid(x, y)
z = np.random.randint(0, 200, size=(100, 200))
c = np.arctan2(x,y)
ax.scatter(x, y, z, c=c, marker='.', s=50, label='')

4、添加边界

对于不同别的参数,可以通过增加边界,可以衡量数据的离散,分布等特征。
利用scipy中的ConvexHull(凸包)函数,将给定的数据按照边界形成多边形,将所有数据包含在里面。凸包是给定平面上一个点集,凸包就是将最外围的点连接起来构成的凸多边形,它能包含点集中所有的点。(需要安装scipy包)

import numpy as np
np.random.seed(19680801)
import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull

fig, ax = plt.subplots()
n = 300
X = np.random.normal(1,1,n)
Y1 = np.random.normal(1,1,n)
X2 = np.random.normal(2.5,1,n)
Y2 = np.random.normal(2.5,2,n)

ax.scatter(X,Y1,c="tab:blue",alpha=0.5,label="blue")
ax.scatter(X2,Y2,c='tab:orange',alpha=0.5,label="orange")
ax.grid(True)

#利用ConvexHull函数获得凸包的多边形点,然后利用Polygon来绘制对应的边界
def encircle(x,y, ax=None, **kw):
    if not ax: ax=plt.gca()
    p = np.c_[x,y]
    hull = ConvexHull(p)
    poly = plt.Polygon(p[hull.vertices,:], **kw)
    ax.add_patch(poly)
#填充色
encircle(X, Y1, ec="g", fc="gold", alpha=0.1)
#边界线
encircle(X, Y1, ec="firebrick", fc="none", linewidth=1.5)
plt.show()

运行结果:
matplotlib之散点图_第8张图片

5、散点直方图

这种图在传统的相关性散点图的基础上还多了一个直方图,来展示该变量在不同维度的分布情况

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

#支持中文
matplotlib.rcParams['font.family'] = ['Heiti TC']
# 生成正相关随机散点
x = np.random.randn(200)
y = x + np.random.randn(200) * 0.5

# 设置各图坐标位置
margin_boder = 0.1
width = 0.6
height = 0.2
margin_between = 0.02

#散点图的坐标位置
left_s = margin_boder
bottom_s = margin_boder
width_s = width
heigh_s = width

#x轴方向直方图的坐标位置
left_x = margin_boder
bottom_x = margin_boder + width + margin_between
heigh_x = height
width_x = width

#y轴方向直方图的坐标位置
left_y = margin_boder + width + margin_between
bottom_y = margin_boder
heigh_y = width
width_y = height

# 生成画布
fig = plt.figure(1, figsize=(10, 10))

# 生成坐标系位置参数
# rect 是位置参数,接受一个由 4 个元素组成的浮点数列表,形如 [left, bottom, width, height] ,它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。
rect_s = [left_s, bottom_s, width_s, heigh_s]
rect_x = [left_x, bottom_x, width_x, heigh_x]
rect_y = [left_y, bottom_y, width_y, heigh_y]
#每个元素的值是画布宽度和高度的分数。即将画布的宽、高作为 1 个单位。比如,[ 0.1, 0.1, 0.8, 0.8],它代表着从画布 10% 的位置开始绘制, 宽高是画布的 80%。


# 生成坐标系
axScatter = plt.axes(rect_s)
axHisX = plt.axes(rect_x)
axHisY = plt.axes(rect_y)

#X轴方向的直方图共用散点图X轴坐标,去除X轴直方图的X轴的坐标刻度
axHisX.set_xticks([])
## 由于y轴方向的直方图共用散点图X轴坐标,去除y轴直方图的y轴的坐标刻度
axHisY.set_yticks([])

# 设置直方图条形宽度
bin_width = 0.25
xymax = np.max([np.max(np.fabs(x)), np.max(np.fabs(y))])
lim = int(xymax / bin_width + 1) * bin_width

# 设置统一坐标系范围
axScatter.set_xlim(-lim, lim)
axScatter.set_ylim(-lim, lim)

# 绘制散点图
axScatter.scatter(x, y, alpha=.5,linewidths=2,edgecolors='w')

# 绘制直方图
# 关于直方图的绘制在后面详细说明
bins = np.arange(-lim, lim + bin_width, bin_width)
axHisX.hist(x, bins=bins, width=[bin_width * 0.9],color = 'steelblue', edgecolor = 'k')
axHisY.hist(y, bins=bins, orientation='horizontal',height=[bin_width * 0.9],color = 'steelblue', edgecolor = 'k')

axHisX.set_xlim(axScatter.get_xlim())
axHisY.set_ylim(axScatter.get_ylim())

# 设置全局title
fig.suptitle("散点直方图",fontsize=20)

plt.show()

运行结果:
matplotlib之散点图_第9张图片


总结

散点图用于展示数据的相关性和分布关系,由X轴和Y轴两个变量组成。通过因变量(Y轴数值)随自变量(X轴数值)变化的呈现数据的大致趋势,同时支持从类别和颜色两个维度观察数据的分布情况,通过matplotlib.pyplot.scatter函数进行绘制。

你可能感兴趣的:(matplotlib系列,散点图,matplotlib,scatter,数据可视化)