【问题标题】:ploting 2D numpy array with seaborn jointplot使用 seaborn 联合图绘制 2D numpy 数组
【发布时间】:2019-04-09 09:17:10
【问题描述】:

有没有办法用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 坐标。

【问题讨论】:

  • 您能澄清一下您要绘制的内容吗?是否每个子数组都根据其索引值绘制?
  • 我对问题进行了编辑。这是否说明了我需要什么?

标签: pandas numpy seaborn


【解决方案1】:

sns.jointplot 不采用二维数组作为参数。它需要(x,y)坐标。如果您按照示例发布并绘制x1x2 作为散点图,您会得到:

现在如果你执行jointplot,你会得到:

现在你看到了,这绘制了点密度。但这些点来自 R->R 函数。您的二维数组是 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")

然后得到你的结果:

编辑刚刚看到您的编辑。那么显示数组的最简单方法是

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

给出:

EDIT2在对您的问题进行更多研究后:存储房间内人员的坐标应该更容易、更准确。

【讨论】:

  • 感谢您的出色回答。现在我了解了该情节的基础知识。有趣的是,我以 R2->R 结束,因为我还做了热图。您的第二次编辑是正确的,这实际上是数据的原始格式:-)
  • 很好,那么您不必为了模拟密度而创建新阵列的恶作剧:D
  • 在循环中对np.append 投反对票。
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2016-05-04
  • 2019-10-23
相关资源
最近更新 更多