我已经将数据分箱以绘制直方图。出于这个原因,我正在使用该plt.bar()
功能。我想将图中的两个轴都设置为对数刻度。
如果我设置plt.bar(x, y, width=10, color='b', log=True)
which 让我将 y 轴设置为 log 但我无法设置 x 轴对数。不幸的是,我尝试过plt.xscale('log')
这不起作用。x 轴刻度消失,条的大小不具有相等的宽度。
如果有任何帮助,我将不胜感激。
我已经将数据分箱以绘制直方图。出于这个原因,我正在使用该plt.bar()
功能。我想将图中的两个轴都设置为对数刻度。
如果我设置plt.bar(x, y, width=10, color='b', log=True)
which 让我将 y 轴设置为 log 但我无法设置 x 轴对数。不幸的是,我尝试过plt.xscale('log')
这不起作用。x 轴刻度消失,条的大小不具有相等的宽度。
如果有任何帮助,我将不胜感激。
默认情况下,bar
绘图条的宽度为 0.8。因此,在对数尺度上,对于较小的 x 值,它们显得较大。如果不是指定恒定宽度,而是使用 bin 边缘之间的距离并将其提供给width
参数,则条形将具有正确的宽度。还需要将其设置align
为"edge"
才能正常工作。
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
x = np.logspace(0, 5, num=21)
y = (np.sin(1.e-2*(x[:-1]-20))+3)**10
fig, ax = plt.subplots()
ax.bar(x[:-1], y, width=np.diff(x), log=True,ec="k", align="edge")
ax.set_xscale("log")
plt.show()
我无法重现丢失的刻度标签以进行对数缩放。这可能是由于代码中的某些设置未在问题中显示,或者由于使用了较旧的 matplotlib 版本。此处的示例适用于 matplotlib 2.0。
如果目标是等宽条,假设数据点不等距,那么最合适的解决方案是将宽度设置为
适合绘图plt.bar(x, y, width=c*np.array(x), color='b', log=True)
的常数。c
对齐可以是任何东西。
我知道这是一个非常古老的问题,你可能已经解决了,但我来这篇文章是因为我遇到了这样的问题,但是在 y 轴上,我设法解决它只是使用ax.set_ylim(df['my data'].min()+100, df['my data'].max()+100)
. 在 y 轴上,我有一些明智的信息,我认为最好的方法是以对数比例显示,但是当我设置对数比例时,我看不到正确的数字(如 x 轴上的这篇文章),所以我只是留下了使用的想法记录并使用 min 和 max 参数。它设置我的图表的比例很像日志。仍在寻找另一种方式,不需要在 set_ylim 使用 -+100。
虽然这实际上并不使用 pyplot.bar,但我认为这种方法可能有助于实现 OP 试图做的事情。我发现这比尝试将宽度校准为对数刻度的函数更容易,尽管它需要更多步骤。创建一个宽度与图表比例无关的线条集合。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.collections as coll
#Generate data and sort into bins
a = np.random.logseries(0.5, 1000)
hist, bin_edges = np.histogram(a, bins=20, density=False)
x = bin_edges[:-1] # remove the top-end from bin_edges to match dimensions of hist
lines = []
for i in range(len(x)):
pair=[(x[i],0), (x[i], hist[i])]
lines.append(pair)
linecoll = coll.LineCollection(lines, linewidths=10, linestyles='solid')
fig, ax = plt.subplots()
ax.add_collection(linecoll)
ax.set_xscale("log")
ax.set_yscale("log")
ax.set_xlim(min(x)/10,max(x)*10)
ax.set_ylim(0.1,1.1*max(hist)) #since this is an unweighted histogram, the logy doesn't make much sense.
一个缺点是“条”将居中,但这可以通过将 x 值偏移线宽值的一半来改变......我认为它将是
x_new = x + (linewidth/2)*10**圆形(np.log10(x),0)。