【问题标题】:Forcing axis labels - How to include x,y inputs for a Z matrix to have sensible axes强制轴标签 - 如何为 Z 矩阵包含 x,y 输入以具有合理的轴
【发布时间】:2020-06-19 05:07:21
【问题描述】:

我有一个 Z 矩阵,当我将它插入 pcolormesh 时,它工作得很好,并给了我下面的情节。唯一的问题是轴现在显示矩阵索引。我使用的代码如下:

#boo - most of the parameters like title,xyz labels, filename comes from command line
data = np.loadtxt((args.data),dtype=float, comments="#")
cmap = plt.get_cmap('bwr')
fig, ax0 = plt.subplots()
divnorm = colors.DivergingNorm(vmin=np.amin(data), vcenter=0, vmax=np.amax(data))
im0 = ax0.pcolormesh(data,norm=divnorm, cmap=cmap)
fig.colorbar(im0,ax=ax0)
ax0.set_title(str(title))
plt.xlabel(str(xlabel))
plt.ylabel(str(ylabel))
filename = str(prefix) + "."+ str(fileformat)
plt.savefig(filename)

我想将 x 轴重新缩放 0.1 倍(最终手动完成,因为我没有看到解决方法)并将 y 轴设置为相对于另一个数组进行更改(注意:我是不操作 Z 矩阵,而是使用物理上有意义的实验值数组 - 此处为 sortData - 对应于矩阵索引)。我更改了我的代码如下 - x 轴和 yaxis 看起来不错,但我的热图看起来不同。有人可以对此有所了解吗?非常感谢

    #foo
    Data = np.loadtxt((args.data),dtype=float, comments="#")
    sort = np.loadtxt((args.sortData),dtype=float, comments="#")

    fig, ax0 = plt.subplots()
    cmap = plt.get_cmap('bwr')
    divnorm = colors.DivergingNorm(vmin=np.amin(Data), vcenter=0, vmax=np.amax(Data))
    #  im0 = ax0.pcolormesh(Data,norm=divnorm, cmap=cmap)
    #  ax0.set_xscale(1, "linear")
    x = np.arange(0.0,10.6,0.1)  # need to set the ticks manually
    y = sort[:,1]
    X,Y = np.meshgrid(x,y)
    Z=z.reshape(len(y),len(x))
   im0 = ax0.pcolormesh(X,Y,Data,norm=divnorm, cmap=cmap)#, extent=[x.min(), x.max(), y.min(), y.max()])
   #im0 = ax0.pcolormesh(x,y,Data,norm=divnorm, cmap=cmap)#, extent=[x.min(), x.max(), y.min(), y.max()])

    cbar = fig.colorbar(im0,ax=ax0)

    if args.zlabel !=None:
         cbar.ax.set_ylabel(str(args.zlabel))
    ax0.set_title(str(args.title))
    plt.xlabel(str(args.xlabel))
    plt.ylabel(str(args.ylabel))
    filename = str(args.prefix) + "."+ str(args.fileformat)
    plt.savefig(filename)

编辑 1: 当我绘制 boo 时,y 轴是均匀间隔的,因为我们正在处理矩阵索引。当我绘制 foo 时,它们不是因为与这些索引相对应的数组值(不是 Data 矩阵的值,而是与 Data 具有相同暗淡但其中存储了与 expt 对应的值的外部 y 数组)不是等间距的。问题是数据矩阵的前 5 个 y 索引对应的 y 值是 1.32、3.200、3.311、3.38、3.40,它们的 x 值在 [xmin 到 xmax] 范围内变化。但是在 0 和 5 (Y) 之间有一个巨大的红色物体,它一直水平移动到 xlim 的末尾。显然有问题,但无法弄清楚是什么。

【问题讨论】:

  • 原始数据数组的形状是什么?
  • data.shape = (106,348) 。我想我只在第二个情节中看到了嘘声的左下部分,但我不确定。
  • 好吧,显然可以有所不同。如果没有xy 作为输入,每个单元格将具有相同的大小,但如果y 的间距不均匀,例如[1, 2, 5,100, 101, 103],那当然会给出不同的图像。
  • 我认为它正在做的是检查 y 的维度与数据矩阵的维度,它只是替换 y 数组中的值。我在这里可能错了。 @Heike x 的一个旁注在 boo 中从 0 到 105 和 y 从 0 到 347 和 foo 相同,但现在 x 从 0 到 10.5 并且 y 从 ymin 到 ymax 但在 348 步中。如果这不明显,我可以编辑问题。对不起
  • 我的论点是:代码不需要有什么问题,可能只是你的数据间隔不均匀,这种情况下你得到的图片完全是预期的。跨度>

标签: python matplotlib plot heatmap


【解决方案1】:

我不是 100% 清楚你想要做什么,但如果你试图在 Boo 中绘制数据但使用一些不同的刻度标签集,那么我认为修改以下独立的这个例子可能对你有用。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors

title = 'Foo'
xlabel = 'X'
ylabel = 'Y'


rv = np.random.rand(100)  # uniform random vector
data = rv[:,None] - rv.T  # pairwise diffs

cmap = plt.get_cmap('bwr')
fig, ax = plt.subplots()
divnorm = colors.DivergingNorm(vmin=np.amin(data), vcenter=0, vmax=np.amax(data))
im0 = ax.pcolormesh(data, norm=divnorm, cmap=cmap)
fig.colorbar(im0, ax=ax)

# do tick labeling stuff here
nticks = 5 
x_tick_pos = np.linspace(0,100,nticks)
y_tick_pos = np.linspace(0,100,nticks)
ax.set_xticks(x_tick_pos)
ax.set_yticks(y_tick_pos)
xtick_labels = [str(x) for x in np.linspace(0, 10, nticks)] # can be any list of strings
ytick_labels = [str(y) for y in np.linspace(0, 10, nticks)] # len must match nticks
ax.set_xticklabels(xtick_labels)
ax.set_yticklabels(ytick_labels)
ax.set_title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)

plt.show()

请注意,如果您想做一些更有趣的事情,例如旋转刻度标签以使其更易于阅读,您可能会通过查看 matplotlib 教程 on labeling heatmaps 获得帮助。

【讨论】:

  • 非常感谢,@LGS,理想情况下,我想要的是将 y 轴安排在 y_min 和 y_max 内。说 y1 = 1.2 y2=3 y3 = 5 .78 blah blah ..所以不是等间距的水平梁,我应该有不等间距的垂直线 - 但我同时想要等间距的标签。强制标签很困难,多亏了你,我少了一件担心的事。
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多