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