如何从matplotlib.pyplot图的y轴刻度标签中移除负号?

4
我正在使用matplotlib.pylot模块生成数千个图表,所有这些图表都涉及一个名为“Total Vertical Depth(TVD)”的值。这些值来自的数据都是负数,但行业标准是将它们显示为正数(即距离零点的距离/绝对值)。我的y轴用于显示数字,并且当然使用实际值(负数)来标记轴刻度。我不想改变这些值,但想知道如何访问文本元素并仅删除每个值中的负号(在图像上用红圈表示)。

enter image description here

在深入研究matplotlib文档后,我进行了几次代码迭代,但仍然遇到错误。
locs, labels = plt.yticks()

newLabels = []

for lbl in labels:
    newLabels.append((lbl[0], lbl[1], str(float(str(lbl[2])) * -1)))

plt.yticks(locs, newLabels)

似乎“labels”列表中的某些字符串为空,因此强制转换无法正常工作,但我不明白如果yticks()方法正在检索当前刻度配置,则它如何具有任何空值。

如果数据不是非常庞大,那么在绘图之前复制数据并更改副本中y轴数据的符号会更简单。 - user6764549
@AmitSingh,但是数字会朝相反的方向走。 - SiHa
是的,那就是问题所在。它们仍然需要按照显示的顺序显示。 - GeoJohn
2个回答

6

@SiHA指出,如果我们更改数据,则y轴标签的顺序将被反转。因此,我们可以使用刻度格式化程序仅更改标签而不更改数据,如下例所示:

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

@ticker.FuncFormatter
def major_formatter(x, pos):
    label = str(-x) if x < 0 else str(x)
    return label

y = np.linspace(-3000,-1000,2001)
fig, ax = plt.subplots()
ax.plot(y)
ax.yaxis.set_major_formatter(major_formatter)
plt.show()

这给我生成了以下的图表,注意y轴标签的顺序。

y轴反转排序


这是一个很棒的解决方案!正是我所需要的,我不想改变数据! - GeoJohn
1
是的。这只是对图形进行了一些表面上的改变,而没有触及数据。 - user6764549
你能解释一下 "@ticker.FuncFormatter" 这行代码实际上是在访问什么吗?我以前从未在Python中看到过这种语法。这是类似于C#中的抽象类的某种覆盖吗? - GeoJohn
2
@GeoJohn 这是一个 Python 的“装饰器”:https://www.python.org/dev/peps/pep-0318/。如果你要移除这个装饰器,你可以通过将后面一行改为 ax.yaxis.set_major_formatter(ticker.FuncFormatter(major_formatter)) 来实现相同的功能。 - tmdavison
也许可以使用 str(abs(x)) 替代 str(-x) if x < 0 else str(x) - Arthur Khazbs

3

编辑:

基于Amit出色的答案,如果您想编辑数据而不是刻度格式化程序,这就是解决方案:

import matplotlib.pyplot as plt
import numpy as np

y = np.linspace(-3000,-1000,2001)
fig, ax = plt.subplots()
ax.plot(-y)  # invert y-values of the data
ax.invert_yaxis()  # invert the axis so that larger values are displayed at the bottom
plt.show()

enter image description here


添加 plt.ylim(0, 200) 以设置视图的下限/上限。 - Felix
我不想改变显示值的顺序,只需要为了显示目的去掉负号。 - GeoJohn
在你的例子中,你可能想要使用 plt.ylim(8850, 8350) - Felix
1
编辑了答案以展示一种替代已接受答案的方法。我使用 ax.invert_yaxis 而不是 plt.ylim,但后者也可以实现相同的效果。输出看起来一样,只是这个版本不会将整数显示为浮点数。 - Felix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接