【问题标题】:How to set fixed spaces between ticks in maptlotlib如何在matplotlib中设置刻度之间的固定空间
【发布时间】:2018-09-08 11:04:14
【问题描述】:

我正在准备延迟百分位结果图表。这是我的 pd.DataFrame 的样子:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
result = pd.DataFrame(np.random.randint(133000, size=(5,3)), columns=list('ABC'), index=[99.0, 99.9, 99.99, 99.999, 99.9999])

我正在使用此功能(注释行是我已经尝试实现目标的不同 pyplot 方法):

def plot_latency_time_bar(result):

    ind = np.arange(4)
    means = []
    stds = []

    for index, row in result.iterrows():
        means.append(np.mean([row[0]//1000, row[1]//1000, row[2]//1000]))
        stds.append(np .std([row[0]//1000, row[1]//1000, row[2]//1000]))

    plt.bar(result.index.values, means, 0.2, yerr=stds, align='center')


    plt.xlabel('Percentile')
    plt.ylabel('Latency')
    plt.xticks(result.index.values)
#     plt.xticks(ind, ('99.0', '99.9', '99.99', '99.999', '99.99999'))
#     plt.autoscale(enable=False, axis='x', tight=False)
#     plt.axis('auto')
#     plt.margins(0.8, 0)
#     plt.semilogx(basex=5)
    plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)


    fig = plt.gcf()
    fig.set_size_inches(15.5, 10.5)

And here is the figure:

如您所见,所有高于 99.0 的百分位数条都重叠并且完全不可读。我想在刻度之间设置一些固定空间,以使它们之间有相同的空间。

【问题讨论】:

  • 欢迎来到 StackOverlfow!请尽量将您的问题简化为一个可验证的最小示例,请参阅:stackoverflow.com/help/mcve。简而言之,您应该有一个仅包含您的问题的示例,并且该示例可以独立运行(例如不依赖您的数据)。
  • 尝试将 x 轴标签用作字符串而不是数字。

标签: python python-2.7 pandas matplotlib


【解决方案1】:

由于您使用的是 pandas,因此您可以在该库中执行所有这些操作:

means = df.mean(axis=1)/1000
stds = df.std(axis=1)/1000
means.plot.bar(yerr=stds, fc='b')

# Make some room for the x-axis tick labels
plt.subplots_adjust(bottom=0.2)
plt.show()

【讨论】:

    【解决方案2】:

    不希望从 xnx 的答案中拿走任何东西(鉴于您在 pandas 工作,这是最优雅的做事方式,因此可能是您的最佳答案)但您缺少的关键见解也就是说,在matplotlib 中,您正在绘制的数据的 x 位置 和 x 刻度 标签 是独立的东西。如果你说:

    nominalX = np.arange( 1, 6 ) ** 2
    y = np.arange( 1, 6 ) ** 4
    
    positionalX = np.arange(len(y))
    plt.bar( positionalX,  y )  # graph y against the numbers 1..n
    plt.gca().set(xticks=positionalX + 0.4, xticklabels=nominalX) # ...but superficially label the X values as something else
    

    那么这与将头寸绑定到您的标称 X 值不同:

    plt.bar( nominalX, y )
    

    请注意,我在刻度的 x 位置添加了 0.4,因为这是条形默认宽度的一半 bar( ..., width=0.8 )——所以刻度最终位于条的中间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 2022-01-09
      • 2019-02-22
      • 2018-06-11
      • 2014-08-03
      • 2011-02-27
      • 2021-07-19
      相关资源
      最近更新 更多