matplotlib技巧,使x轴上的每个整数之间的间距不等

w80xi6nr  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(213)

下面代码模拟了一个分布,并绘制了一个堆叠直方图

import numpy as np
import matplotlib.pyplot as plt

f1f2=[(i**6-int(i**6))/5 for i in np.random.exponential(0.8, size=100)]
widz=[i*(1/max(f1f2)) for i in f1f2]

pos=[i for i in range(100)]
f1=[np.random.uniform()*i for i in f1f2]
f2=[s-i for s,i in zip(f1f2,f1)]

fig = plt.figure(figsize=(20,2), constrained_layout=False)
ax = fig.add_gridspec(nrows=1, ncols=1, hspace=0).subplots(sharex=True)
ax.bar(pos, f1,
        color="red",
        edgecolor="none",width=widz)
ax.bar(pos, f2,
        bottom=f1,
        color="blue",
        edgecolor="none",width=widz)

结果如下:

我想完全相同的宽度为每个酒吧(成比例的总和,2个价值观),但没有空间之间的每个酒吧。所以x轴将难以阅读...是的。

iyfjxgzm

iyfjxgzm1#

我想完全相同的宽度为每个酒吧(成比例的总和2值),但没有空间之间的每个酒吧。
如果我理解正确的话,设置每个条形的位置,使其落在前一个条形的宽度之后,应该可以达到您的目的。
特别是:

  • 第一个位置应该是零,
  • 第二位置应该是第一条的宽度,
  • 第三位置应该是第一条和第二条的累积宽度,
  • 等等...
# [...]

cs_widths = np.cumsum(widz)
pos = np.concatenate([ [0], cs_widths[:-1] ])  # instead of range(100)

# [...]

用这种方法修改pos变量并将对齐模式设置为"edge"(bar()调用中的align="edge"),应该会得到下图。

正如@Tranbi所指出的,轴xticks现在的范围从0sum(widz),如果需要,可以重新标记xticks以保持原来的[0,100]范围。

# Example with ticks every 5 bars, ranging from 0 to 100
ticks_labels = range(100)
ax.set_xticks(pos[::5], labels=ticks_labels[::5])

虽然,正如你提到的,"x轴将很难读懂"。一些刻度标签可能会重叠。

相关问题