用seaborn jointplot绘制二维numpy数组

时间:2018-11-06 00:14:54

标签: pandas numpy seaborn

是否可以使用sns.jointplot绘制2D numpy.array?

这是我的数组:

a = np.array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    1., 0., 0., 0., 0., 0., 1., 1., 2., 1., 2., 1., 1., 1., 0., 0.,
    0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 1., 0., 0.,
    1., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0.,
    0., 0., 0., 0., 0.],
   [0., 0., 2., 1., 2., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.,
    0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.,
    1., 1., 1., 0., 0.],
   [0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0.]])

我尝试做df = pd.DataFrame(a),并且得到了预期的矩阵,但是随后sns.jointplot(df)失败了,因为我不知道对xy使用什么。它应该看起来像这样:https://seaborn.pydata.org/examples/joint_kde.html

我们非常感谢您的帮助。 谢谢。

编辑:我想要的绘图是存储在a中的值的图形表示。这些值表示位置上的人数,数据的2轴是地板的xy坐标。

1 个答案:

答案 0 :(得分:0)

sns.jointplot不使用2D数组作为参数。它需要(x,y)坐标。如果遵循该示例,则将x1x2发布并绘制为散点图,将得到以下信息:

<code>plt.scatter(x1,x2)</code>

现在,如果您执行jointplot,您将得到:

<code>g = sns.jointplot(x1, x2, kind="kde", height=7, space=0)</code>

现在您看到,这绘制了点密度。但是这些点来自R-> R函数。您的2D数组是R²-> R函数。如果希望将其重新解释为点密度,则可以将其转换为R-> R函数,在计算其密度时,它看起来与旧的R²-> R函数相同。

幸运的是,您只有整数,因此,例如,如果您想要 数组坐标2上的值[0,24],那么您只需要在坐标(0,24)上有两个点就可以接收密度值2。因此,我们要做的就是找出应该在哪里的点,然后获得所需的两个数组:

#initiate
y1 = np.array([])
y2 = np.array([])

#create locations
for i in range(1,a.max()+1):
    for j in range(i):
        locs = np.where(a==i)
        try:
            y1 = np.append(y1, locs[0])
            y2 = np.append(y2, locs[1])
        except: #this number doesn't exist in the array
            break
对于数组中的每个数字 n

,这将在正确位置创建 n 点。然后,您可以致电:

g2 = sns.jointplot(y1, y2, kind="kde")

并获得结果:

g2 = sns.jointplot(y1, y2, kind="kde")

编辑:刚刚看到了您的修改。嗯,显示数组最简单的方法就是

import matplotlib.pyplot as plt
plt.imshow(a)

给出:

<code>plt.imshow(a)</code>

EDIT2 之后,您对问题进行了更多研究:将房间中的人的坐标存储在房间中应该更容易,更精确。