Matplotlib条形图,用于显示x轴上方的负数

时间:2018-06-24 15:10:30

标签: python matplotlib

我正在尝试制作一个负值的条形图,其中基线x轴位于-10而不是0,并且这些值(均为-10<x<0)从基线向上延伸。

如果按原样绘制,则条形图向下延伸:

import matplotlib.pyplot as plt
vals = [-4, -6, -8, -6, -5]
plt.bar(range(len(vals)), vals)

enter image description here

从某种意义上讲,我可以通过在数据上加10来伪造它,但随后我必须删除y-tick值,并且需要保留它们。

new_vals = [val + 10 for val in vals]
plt.yticks([])
plt.bar(range(len(new_vals)), new_vals)

enter image description here

那么我该如何在第一张图像的y点上制作第二张图像,并且最好不“伪造”任何数据?

2 个答案:

答案 0 :(得分:0)

https://matplotlib.org/gallery/ticks_and_spines/custom_ticker1.html为例,您也可以这样做:

from matplotlib.ticker import FuncFormatter
def neg_tick(x, pos):
    return '%.1f' % (-x if x else 0) # avoid negative zero (-0.0) labels

formatter = FuncFormatter(neg_tick)
fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(formatter)
plt.bar(range(len(vals)), [-v for v in vals]) # or -numpy.asarray(vals)
# or, let Python enumerate bars:
# plt.bar(*zip(*enumerate(-v for v in vals)))
plt.show()

您不能“伪造”数据。条形图以向上的条形表示正数据,向下的条形表示负数。如果您希望有所不同,则需要以某种方式欺骗条形图。

enter image description here

IMO,上述解决方案优于https://stackoverflow.com/a/11250884/8033585,因为它不需要绘画画布,更改标签等技巧。


如果您确实希望“恢复”钢筋长度(如您的示例所示),则可以执行以下操作:

from matplotlib.ticker import FuncFormatter
import numpy as np

# shifted up:
vals = np.asarray(vals)
minval = np.amin(vals)
minval += np.sign(minval) # "add" 1 so that "lowest" bar is still drawn
def neg_tick(x, pos):
    return '%.1f' % (x + minval if x != minval else 0)

formatter = FuncFormatter(neg_tick)
fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(formatter)
plt.bar(*zip(*enumerate(-minval + vals)))
plt.show()

enter image description here

答案 1 :(得分:0)

尝试matplotlib.axes.Axes.invert_yaxis

import requests

def main():
    content = requests.get("https://google.com")
    print(content.status_code)

if __name__ == "__main__":
    main()

enter image description here

File "/usr/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args)

enter image description here