在matplotlib散点图中针对x和y绘制一些第三变量?

时间:2019-03-20 23:12:44

标签: python matplotlib scatter

我一般对散点图和python很陌生。我正在尝试针对x和y绘制第三个变量,但是,我不确定如何指定该参数?因此,我将拥有X值(整数),y值(也整数),然后在图形本身上希望模型分数显示出来。有什么办法做这种事情吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用颜色绘制第三个值。这是一个非常小的示例:

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

x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
plt.scatter(x,y, c=z, s=5, cmap=cm.hsv)
cbar= plt.colorbar()
plt.show()

enter image description here


修改

您还可以使用标记的大小,其透明度,色相或rgb值来描绘更多信息。这是一个在感知上一致的颜色图上标记大小,alpha级别和颜色的示例。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as colors
import matplotlib.cm as cmx

x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
t = np.random.rand(100)
w = np.random.rand(100)
fig, ax = plt.subplots(1, 1)
cmap = plt.get_cmap('plasma')
cNorm  = colors.Normalize(vmin=0, vmax=max(z))
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cmap)
for i in range(100):
    ax.scatter(x[i],y[i], c=scalarMap.to_rgba(z[i]), s=t[i]*100, cmap=cmx.plasma, alpha=w[i], edgecolor='none')
scalarMap.set_array([])
fig.colorbar(scalarMap,ax=ax)
for a in [0.1, 0.5, 0.9]:
    ax.scatter([], [], c='k', alpha=0.5, s=a*100, label=str(a), edgecolors='none')
l1 = ax.legend(scatterpoints=1, frameon=True, loc='lower left' ,markerscale=1)
for b in [0.25, 0.5, 0.75]:
    ax.scatter([], [], c='k', alpha=b, s=50, label=str(b), edgecolors='none')
ax.legend(scatterpoints=1, frameon=True, loc='lower right' ,markerscale=1)
fig.show()

enter image description here

答案 1 :(得分:1)

从表面上看,这个问题真的没有道理,因为传统的散点图只有两个轴,当然您不能绘制三个维度(x,y和精度)的点

但是,还有其他方法可以实现。

  1. 使用颜色
import numpy as np
from matplotlib import pyplot as plt

x = np.random.rand(200)
y = np.random.rand(200)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(x, y, c=(x + y), cmap='RdPu')

scatter带有一个c参数(可以是一个数字值)和一个cmap参数,可以是一个引用colormap的字符串。

colormap对象将c中提供的数字转换为沿颜色映射的点,您可以将其视为渐变条。

  1. 使用3D轴
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(5, 5))
ax = Axes3D(fig)

ax.scatter(x, y, (x + y))

这会将您的第3维(精度)转换为普通的空间维。

  1. 使用标记的大小

与第一部分中的颜色选项非常相似,您可以更改分散标记的大小(只要您对值的比例有所了解)。因此,根据第一个示例,您也可以这样做;

import numpy as np
from matplotlib import pyplot as plt

x = np.random.rand(200)
y = np.random.rand(200)

fig, ax = plt.subplots(figsize=(5, 5))
ax.scatter(x, y, c='k', s=5*(x + y), cmap='RdPu')

scatter也使用s参数,该参数会更改标记的大小。