Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何从matplotlib.pyplot figure中的y记号标签中删除负号?_Python 2.7_Matplotlib - Fatal编程技术网

Python 2.7 如何从matplotlib.pyplot figure中的y记号标签中删除负号?

Python 2.7 如何从matplotlib.pyplot figure中的y记号标签中删除负号?,python-2.7,matplotlib,Python 2.7,Matplotlib,我正在使用matplotlib.pylot模块生成数千个图形,这些图形都处理一个名为“总垂直深度(TVD)”的值。这些值来自的数据都是负数,但行业标准是将它们显示为正数(即与零/绝对值的距离)。y轴用于显示数字,当然也使用实际值(负数)来标记轴标记。我不想更改这些值,但我想知道如何访问文本元素,并从每个值中删除负面符号(如图中红色圆圈所示) 在深入matplotlib文档之后,经过几次代码迭代,我得到了下面的代码,但仍然得到一个错误 locs, labels = plt.yticks() n

我正在使用matplotlib.pylot模块生成数千个图形,这些图形都处理一个名为“总垂直深度(TVD)”的值。这些值来自的数据都是负数,但行业标准是将它们显示为正数(即与零/绝对值的距离)。y轴用于显示数字,当然也使用实际值(负数)来标记轴标记。我不想更改这些值,但我想知道如何访问文本元素,并从每个值中删除负面符号(如图中红色圆圈所示)

在深入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)
“标签”列表中的某些字符串似乎是空的,因此强制转换无法正常工作,但我不明白如果yticks()方法正在检索当前的勾号配置,它怎么会有空值。

编辑:

根据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()

@SiHA指出,如果我们更改数据,则y轴上标签的顺序将颠倒。因此,我们可以使用a仅更改标签,而不更改数据,如下例所示:

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()
导入matplotlib.pyplot作为plt
将matplotlib.ticker导入为ticker
将numpy作为np导入
@ticker.FuncFormatter
def主格式化程序(x,位置):
label=str(-x)如果x<0,其他str(x)
退货标签
y=np.linspace(-3000,-10002001)
图,ax=plt.子批次()
斧头图(y)
ax.yaxis.set\u major\u格式化程序(major\u格式化程序)
plt.show()
这给出了下面的图,请注意y轴标签的顺序


如果数据不是很大,那么在打印之前复制并更改副本中y轴数据的符号要简单得多。@amitsigh,但是数字会朝相反的方向移动,这就是问题所在。它们仍然需要按显示的顺序显示。添加
plt.ylim(0200)
要设置下/上视图限制我不想更改显示值的顺序,我只需要删除负号以显示。在您的示例中,您可能需要
plt.ylim(88508350)
编辑答案以显示可接受答案的备选答案。我使用的是
ax.invert\u yaxis
而不是
plt.ylim
,但后者也可以实现同样的效果。输出看起来是一样的,只是这个版本没有将整数显示为浮点数。这是一个很好的解决方案!这正是我需要的,我不会改变数据!对这只是对绘图的表面更改,不涉及数据。请解释“@ticker.FuncFormatter”行实际访问的内容好吗?我以前从未在python中见过这种语法。这是一种类似于C#中的抽象类的覆盖吗?@GeoJohn它是python的“装饰器”:。如果要删除decorator,可以通过将后面的行更改为
ax.yaxis.set\u major\u formatter(ticker.FuncFormatter(major\u formatter))
如果x<0,则可以使用
str(abs(x))
而不是
str(-x)