matplotlib可视化之Scatter散点图

2020-05-02  本文已影响0人  丰年的博客

散点图

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

散点图可以提供三类关键信息:
(1)变量之间是否存在数量关联趋势(正相关,负相关,不相关等);
(2)如果存在关联趋势,是线性还是非线性的;
(3)观察是否有存在离群值,从而分析这些离群值对建模分析的影响。

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)
  1. 常用参数:

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

扩展应用:

import numpy as np
import matplotlib.pyplot as plt
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()
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()
上一篇 下一篇

猜你喜欢

热点阅读