为什么我的matplotlib条形图压缩x轴时,我会记录'

时间:2016-07-08 19:19:26

标签: python python-3.x matplotlib logarithm

我正在尝试使用matplotlib为python制作条形图。我可以制作一个正常的图表,但是当我把它放在对数模式下以便我可以更好地看到数据时,x轴看起来好像在压缩。到底是怎么回事? 注意:所有数据记录的最小值均为1.

    x = [t[0] for t in data]
    y = [t[1]  for t in data]

    x_pos = np.arange(len(x))

    plt.bar(x_pos, y, color='blue', log=False)
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.title(title)
    plt.xlim([0, len(x)])
    #plt.yscale('log')
    #plt.semilogy(x_pos, np.exp(-x_pos/5.0))
    plt.savefig(output_path + '/' + filename)

收益率:enter image description here

但只需将log=False更改为log=True即可: enter image description here

我做错了什么?我只想获得y轴上第一个图的压缩视图。正如您所看到的,我也尝试了yscale('log'),但我得到了相同的结果。

谢谢!

编辑:看起来它与之前的行有关,当我删除第一行它工作正常,但未分类:

data = sorted(data, key=lambda tup: tup[1], reverse=True)

    # tuples (pair,count)
    x = [t[0] for t in data]
    y = [t[1]  for t in data]

2 个答案:

答案 0 :(得分:3)

如果您只想在y轴上使用对数刻度而不是x使用:

import matplotlib.pyplot as plt

plt.semilogy(x,y) #plots log on y axis

plt.semilogx(x,y) #plots log on x axis

或者,你可以设置轴'记录:

ax = plt.subplot(224)

ax.set_xscale("log")
ax.set_yscale("log")

plt.bar(x,y)

答案 1 :(得分:1)

它不会压缩你的x轴;第二个绘图的y轴的最小值是1(10 ^ 0),它出现的是最小的一组条的高度。因此,最右边的柱子在你的semilog图上没有 y 比例。

尝试添加,例如

plt.ylim([0.1, 100])

强制执行最右边的栏的可见性。 (由于显而易见的原因,对数刻度轴的最小限制不能为0.)