代码之家  ›  专栏  ›  技术社区  ›  Mattia Surricchio

Seaborn:在轴上的大数字上加点

  •  -1
  • Mattia Surricchio  · 技术社区  · 4 年前

    如何将x轴上的数字格式更改为 10,000 而不是 10000 ? 理想情况下,我只想做这样的事情:

    x = format((10000.21, 22000.32, 10120.54), "#,###")
    

    代码如下:

    import matplotlib.pyplot as plt
    
    # create figure instance
    fig1 = plt.figure(1)
    fig1.set_figheight(15)
    fig1.set_figwidth(20)
    
    ax = fig1.add_subplot(2,1,1)
    
    x = 10000.21, 22000.32, 10120.54
    
    y = 1, 4, 15
    ax.plot(x, y)
    
    ax2 = fig1.add_subplot(2,1,2)
    
    x2 = 10434, 24444, 31234
    y2 = 1, 4, 9
    ax2.plot(x2, y2)
    
    fig1.show()
    
    0 回复  |  直到 8 年前
        1
  •  93
  •   falsetru    10 年前

    使用 , 作为 format specifier :

    >>> format(10000.21, ',')
    '10,000.21'
    

    str.format 而不是 format :

    >>> '{:,}'.format(10000.21)
    '10,000.21'
    

    matplotlib.ticker.FuncFormatter :

    ...
    ax.get_xaxis().set_major_formatter(
        matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
    ax2.get_xaxis().set_major_formatter(
        matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
    fig1.show()
    

    enter image description here

        2
  •  38
  •   Alex    6 年前

    StrMethodFormatter :

    import matplotlib as mpl
    ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}'))
    

    例如:

    import pandas as pd
    import requests
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    url = 'https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USDT&aggregate=1'
    df = pd.DataFrame({'BTC/USD': [d['close'] for d in requests.get(url).json()['Data']]})
    
    ax = df.plot()
    ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}'))
    plt.show()
    

    enter image description here

        3
  •  23
  •   Jarad    7 年前

    每次我试着这么做的时候,我总是发现自己在同一页上。当然,其他答案可以完成任务,但不容易下次记住!例如:导入ticker并使用lambda、custom def等。

    ax :

    ax.set_yticklabels(['{:,}'.format(int(x)) for x in ax.get_yticks().tolist()])
    
        4
  •  8
  •   DanT    8 年前

    如果你喜欢简陋和简短,你也可以只更新标签

    def update_xlabels(ax):
        xlabels = [format(label, ',.0f') for label in ax.get_xticks()]
        ax.set_xticklabels(xlabels)
    
    update_xlabels(ax)
    update_xlabels(ax2)
    
        5
  •  7
  •   pad    10 年前

    你可以用 matplotlib.ticker.funcformatter

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.ticker as tkr
    
    
    def func(x, pos):  # formatter function takes tick label and tick position
        s = '%d' % x
        groups = []
        while s and s[-1].isdigit():
            groups.append(s[-3:])
            s = s[:-3]
        return s + ','.join(reversed(groups))
    
    y_format = tkr.FuncFormatter(func)  # make formatter
    
    x = np.linspace(0,10,501)
    y = 1000000*np.sin(x)
    ax = plt.subplot(111)
    ax.plot(x,y)
    ax.yaxis.set_major_formatter(y_format)  # set formatter to needed axis
    
    plt.show()
    

    enter image description here

        6
  •  0
  •   Tomas Giro    4 年前

    简答不导入 matplotlib as mpl

    plt.gca().yaxis.set_major_formatter(plt.matplotlib.ticker.StrMethodFormatter('{x:,.0f}'))
    

    修改自@AlexG的答案