【问题标题】:Bubble-plot weighted 2d scatter plot data onto mesh/grid气泡图加权二维散点图数据到网格/网格上
【发布时间】:2019-06-27 02:25:11
【问题描述】:

背景

我有一组二维的“原始”数据点,以数组的形式,即:

[[0, 0, 1, 0, 0],
 [0, 1, 2, 1, 0],
 [1, 2, 4, 2, 1],
 [0, 1, 2, 1, 0],
 [0, 0, 1, 0, 0]]

数据表示二维空间中的圆形“质量分布”图。 x-y 坐标表示数据点的 x-y 分布,每个 x-y 坐标处的值是在该数据点测量的质量/强度。

我想绘制此数据,仅使用 Python, (only at the integral x-y intersections),如下图所示,但使用我自己的 xy 散点图数据,而不是绘制 2D 线/函数.

另外,我想结合"specify dot size" logic from another SO question,它允许我在“每个样本/值”的基础上指定点大小,即:


问题

如何结合上面的逻辑来呈现这样的数据集:

[[0, 0, 1, 0, 0],
 [0, 1, 2, 1, 0],
 [1, 2, 4, 2, 1],
 [0, 1, 2, 1, 0],
 [0, 0, 1, 0, 0]]

像这样,通过matplotlib/pyplot(离散域,离散范围,连续值):


额外

How can I re-use the above data set to generate a heatmap of the same data (i.e. continuous-domain, continuous-range, continuous valued)?

或者,更像这样:

【问题讨论】:

    标签: python arrays matplotlib plot scatter-plot


    【解决方案1】:

    您可以通过首先创建一个meshgrid 来定义您的x 和y 坐标,然后使用data 数组来定义您的点的大小。 0 的条目将不会显示,因为大小为 0。我使用 100 的缩放因子来放大点。

    完整的工作代码:


    import numpy as np
    import matplotlib.pyplot as plt
    
    data = np.array([[0, 0, 1, 0, 0],
     [0, 1, 2, 1, 0],
     [1, 2, 4, 2, 1],
     [0, 1, 2, 1, 0],
     [0, 0, 1, 0, 0]])
    
    mesh = np.arange(len(data))
    x, y = np.meshgrid(mesh, mesh)
    plt.scatter(x, y, s=data*100)
    plt.xticks(range(len(data))) # To put ticks at integer values
    plt.yticks(range(len(data))) # To put ticks at integer values
    plt.show()
    

    生成热图

    import numpy as np
    import matplotlib.cm as cm
    import matplotlib.pyplot as plt
    
    # data here
    
    x, y = np.meshgrid(np.arange(len(data)), np.arange(len(data)))
    plt.scatter(x, y, s=data*100, c=data, cmap=cm.Oranges)
    plt.xticks(range(len(data)))
    plt.yticks(range(len(data)))
    

    【讨论】:

    • 非常简单。最后一个问题:如何启用整数值的 x/y 行?它们没有在我的系统上呈现,所以我不妨明确设置它们。
    • 另外,有没有一种简单的方法可以重复使用相同的数据集来生成热图?谢谢。
    • @DevNull:我现在在答案中包含了您的偏好。希望您的问题现在得到解答。
    • 我可以通过plt.grid() 启用网格线。最后一个问题,是否有一种简单的方法可以将您的第二个热图转换为具有更高分辨率的图形,类似于我添加到问题中的最新(即底部)图像?谢谢。
    • @DevNull:要获得我的答案中的灰色背景和白色网格线,您可以使用 seaborn 作为import seaborn as sns,然后使用sns.set()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2011-07-19
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多