matplotlib 如何在matpllib中设置非周期增量的轴刻度

mzillmmw  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(102)

我有一个二维数组,表示给定参数A和B的过程效率。参数A沿着列周期性变化,从0到225,增量为1。问题出在参数按以下顺序变化的行:

[16 ,18 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,35 ,40 ,45 ,50 ,55 ,60 ,65 ,70 ,75 ,80 ,85 ,90 ,95 ,100 ,105 ,110 ,115 ,120 ,125]

因此,即使行以增量1增加,它们也表示参数B的非均匀增量。我需要在y轴上展示参数B的值。使用axes.set_yticks()并不能给予我所寻找的结果,我确实理解其中的原因,但不知道如何求解。
举个最小的例子:

# Define parameter B values
parb_increment = [16, 18, 20] + list(range(21,34)) + list(range(35,126,5))

print(len(parb_increment))
print(x.shape)

# Figure and axes
figure, axes = plt.subplots(figsize=(10, 8))

# Plotting
im = axes.imshow(x, aspect='auto',
                 origin="lower",
                 cmap='Blues',
                 interpolation='none',
                 extent=(0, x.shape[1], 0, parb_increment[-1]))

# Unsuccessful trial for yticks
axes.set_yticks(parb_increment, labels=parb_increment)

# Colorbar
cb = figure.colorbar(im, ax=axes)

前面的代码给出了下面的图和输出,您可以看到刻度不仅放错了位置,而且从不正确的位置开始。

35
(35, 225)

rdrgkggo

rdrgkggo1#

控制每个像素的宽度/高度的项是aspect。不幸的是,你不能使它可变。即使你修改/更新y轴刻度,aspect也不会改变。这就是为什么在你的例子中,刻度与像素行没有对齐。
因此,您的问题的解决方案是复制那些非均匀递增的行
参见以下示例:

import numpy as np
import matplotlib.pyplot as plt

# Generate fake data
x = np.random.random((3, 4))

# Create uniform x-ticks and non-uniform y-ticks
x_increment = np.arange(0, x.shape[1]+1, 1)
y_increment = np.arange(0, x.shape[0]+1, 1) * np.arange(0, x.shape[0]+1, 1)

# Plot the data
fig, ax = plt.subplots(figsize=(6, 10))

img = ax.imshow(
    x,
    extent=(
        0, x.shape[1], 0, y_increment[-1]
    )
)

fig.colorbar(img, ax=ax)
ax.set_xlim(0, x.shape[1])
ax.set_xticks(x_increment)
ax.set_ylim(0, y_increment[-1])
ax.set_yticks(y_increment);

这将复制您的问题并生成following outcome

    • 解决方案**

首先,确定数组中每行的重复次数:

nr_of_repeats_per_row =np.diff(y_increment)
nr_of_repeats_per_row = nr_of_repeats_per_row[::-1]

您需要颠倒顺序,因为图像中的顶行是数组中的第一行,y_increments提供从数组中最后一行开始的各行之间的差值。
现在,您可以将数组中的每一行重复特定的次数:

x_extended = np.repeat(x, nr_of_repeats_per_row, axis=0)

使用x_extended重新绘制:

fig, ax = plt.subplots(figsize=(6, 10))

img = ax.imshow(
    x_extended,
    extent=(
        0, x.shape[1], 0, y_increment[-1]
    ),
    interpolation="none"
)
fig.colorbar(img, ax=ax)
ax.set_xlim(0, x.shape[1])
ax.set_xticks(x_increment)
ax.set_ylim(0, y_increment[-1])
ax.set_yticks(y_increment);

你也该试试。

相关问题