为什么我的 matplotlib 条形图在我执行 'log' 时会压缩 x 轴
Why is my matplotlib bar chart compressing the x-axis when I do 'log'
我正在尝试使用 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)
产量:
但只需将 log=False
更改为 log=True
我得到:
我做错了什么?我只想获得 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]
如果您只想在 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)
它没有压缩你的 x 轴;第二个图的 y 轴的最小值是 1 (10^0),它看起来是最小的条形集的高度。因此,最右边的条在半对数图上不在 y 范围内。
尝试添加,例如,
plt.ylim([0.1, 100])
强制显示最右边的条形。 (出于显而易见的原因,对数刻度轴的最小限制不能为 0。)
我正在尝试使用 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)
产量:
但只需将 log=False
更改为 log=True
我得到:
我做错了什么?我只想获得 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]
如果您只想在 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)
它没有压缩你的 x 轴;第二个图的 y 轴的最小值是 1 (10^0),它看起来是最小的条形集的高度。因此,最右边的条在半对数图上不在 y 范围内。
尝试添加,例如,
plt.ylim([0.1, 100])
强制显示最右边的条形。 (出于显而易见的原因,对数刻度轴的最小限制不能为 0。)