更改 matplotlib 中的 y 轴

问题描述 投票:0回答:1

如何更改 matplotlib 中的 y 轴,以便指定刻度 ([0, -1, -8, -44, -244]),但它们均匀分布在 y 轴上(0 和 0 之间的间隙)如果你想象一下这个数字,-1 就和 -44 和 -244 之间的差距一样大)。所以你在 y 轴上没有线性分布,但它让你的绘图看起来更好。刻度之间的距离应该相等,这会让你的图表看起来更好。

我首先尝试使用普通的 yticks。我还尝试了使用 ax.set_yticks 和 ax.set_ytickslabels 的方法。然而,它并没有给我想要的结果。

python matplotlib axis
1个回答
0
投票

如果有一个最低限度的工作示例来看看您正在使用什么类型的数据/绘图,那就太好了。但一般来说,听起来您需要转换数据/轴,而不仅仅是选择自定义刻度。

您可以使用 matplotlib 中的 自定义比例 来完成此操作。下面,我使用插值来强制

[-244, -44, -8, -1, 0]
具有等距值(在本例中为
[0..4]
)。使用缩放函数而不是缩放输入数据的优点是可以在原始比例中指定 yticks 等。

我假设您确实需要一组特定的值等距,但您还应该检查其他(更简单的)缩放方法,例如

set_yscale('log')
,如果它们使您的绘图看起来更好。

import matplotlib.pyplot as plt
import numpy as np

# Sample data
x = np.linspace(0, 10, 100)
y = 255*(np.sin(x)/2 - 0.5)

# Define the values that need to be equally spaced
y_scale = [-244, -44, -8, -1, 0]
y_scale_vals = np.arange(len(y_scale))

# Interpolate such that -244 -> 0, -44 -> 1, -8 -> 2, -1 -> 3, 0 -> 4
def forward(y):
    return np.interp(y, y_scale, y_scale_vals)
def inverse(y):
    return np.interp(y, y_scale_vals, y_scale)

fig, ax = plt.subplots(1,2, layout='constrained')
ax[0].plot(x, y)
ax[0].set_title('Linear scale')

ax[1].plot(x, y)
ax[1].set_yscale('function', functions=(forward, inverse))
ax[1].yaxis.set_ticks(y_scale)
ax[1].set_title('Custom scale')

An example sinusoidal dataset plotted with either a linear y axis, or a custom transform on the y axis that spaces the desired values equally

© www.soinside.com 2019 - 2024. All rights reserved.