【问题标题】:Is it possible to leave blank spaces in matplotlib's pcolormesh plots?是否可以在 matplotlib pcolormesh 图中留下空格?
【发布时间】:2021-01-10 03:33:04
【问题描述】:

我在 python 中使用matplotlib.pyplot.pcolormesh 显示一些数据,我想在缺少数据点的地方留下空格。

假设我收集了 x 值 0 到 10 和 y 值 0 到 10 的数据,但不是每个这样的值。目前,我使用np.zeros((11,11)) 初始化我的数据存储数组,然后如果我有该点的数据,则使用for 循环将该数组的值更改为数据值。

这给我留下了一堆数据加上数组中的一些零。当我绘制此图时,无法区分没有数据的点和具有小值数据的点。

是否可以使缺失数据点与非缺失数据点明显不同?例如,在下面的代码中,我希望 (3,1)(5,7)(8,8) 处的方块着色,但其余方块为白色。

我也尝试使用np.empty((11,11))np.full((11,11),np.nan) 初始化我的数据存储阵列,但它们都产生与np.zeros 相同的输出。下面是代码:

import numpy as np
import matplotlib.pyplot as plt

data_storage = np.zeros((11,11))
collected_data = [[3, 1, 45.2], [5, 7, 23.9], [8, 8, 78.4]

for data in collected_data:
    x_coord = data[0]
    y_coord = data[1]
    value = data[2]
    data_storage[y_coord,x_coord] = value

all_x_values = np.linspace(0,10,11)
all_y_values = np.linspace(0,10,11)

plt.pcolormesh(all_x_values, all_y_values, data_storage)
plt.show()

【问题讨论】:

    标签: python matplotlib plot colormap


    【解决方案1】:

    一种方法是将全零更改为NaN,这将使相应的单元格透明。

    请注意,pcolormesh 的 x 和 y 值是针对网格点的,而不是针对中心的,因此您需要在每个维度(11 个单元格,12 个单元格边框)中多一个值。这允许创建具有不同单元大小的颜色网格。如果您希望刻度很好地位于单元格的中心,您可以将单元格边框放在两半。

    (在forloop下面的代码中已经写得更简洁了)。

    import numpy as np
    import matplotlib.pyplot as plt
    
    data_storage = np.zeros((11, 11))
    collected_data = [[3, 1, 45.2], [5, 7, 23.9], [8, 8, 78.4]]
    
    for x_coord, y_coord, value in collected_data:
        data_storage[y_coord, x_coord] = value
    
    all_x_values = np.arange(0, 12) - 0.5
    all_y_values = np.arange(0, 12) - 0.5
    
    plt.pcolormesh(all_x_values, all_y_values, np.where(data_storage == 0, np.nan, data_storage))
    plt.gca().xaxis.set_major_locator(MultipleLocator(1))
    plt.gca().yaxis.set_major_locator(MultipleLocator(1))
    plt.colorbar()
    plt.show()
    
    

    另一种方法是创建一个颜色图,设置'under' color 并将vmin 设置为略大于0 的值。或者,可以使用extend='min' 在颜色栏中显示“下”颜色。

    from copy import copy
    my_cmap = copy(plt.cm.get_cmap('viridis'))
    my_cmap.set_under('lightgrey')
    plt.pcolormesh(all_x_values, all_y_values, data_storage, cmap=my_cmap, vmin=0.000001)
    plt.colorbar(extend='min', extendrect=True)
    

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多