代码之家  ›  专栏  ›  技术社区  ›  jss367

X轴以上负数的matplotlib条形图[副本]

  •  0
  • jss367  · 技术社区  · 6 年前

    这个问题已经有了答案:

    • modify tick label text 9个答案
      • 我正试图制作一个负值条形图,其中基线x轴为-10而不是0和这些值,因为它们都是 -10<x<0 ,从基线向上延伸。

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

        导入matplotlib.pyplot as plt vals=[-4,-6,-8,-6,-5] PLT.BAR(范围(长度(VAL)),VAL)

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

        new_vals=[val+10 for val in vals]
        请点击([])
        PLT.BAR(范围(长度(新值)),新值)
        

        那么,如何使用第一个图像的Y记号来制作第二个图像,最好是不“伪造”任何数据? 9个答案

    我试图制作一个负数值的条形图,其中基线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记号值,并且需要保留它们。

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

    enter image description here

    那么,如何使用第一个图像的Y记号来制作第二个图像,最好是不“伪造”任何数据?

    2 回复  |  直到 6 年前
        1
  •  0
  •   AGN Gazer    6 年前
    定义负勾号(x,pos): ax.yaxis.set_major_格式化程序(格式化程序) #plt.bar(*zip(*enumerate(-v for v in vals)))
    
    
    

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

    如果您确实希望“还原”条形长度(如示例中所示),则可以执行以下操作:

    返回“%.1f%”(如果是x,则返回x+minval!=minval其他0) 图,ax=plt.子批次()。
    
    例如,您也可以这样做:

    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

    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

        2
  •  0
  •   iayork    6 年前

    尝试 matplotlib.axes.axes.invert_yaxis

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

    enter image description here

    fig, ax1 = plt.subplots(1,1)
    ax1.bar(range(len(vals)), vals)
    ax1.invert_yaxis()
    

    enter image description here