如何使用 matplotlib 修复堆栈条形图的最大值?
How to fix the max value of a stack bar chart's using matplotlib?
我正在尝试从 2 个列表创建堆栈条形图:
counts_start = [tensor(0.),
tensor(0.),
tensor(0.0050),
tensor(0.0100),
tensor(0.2833),
tensor(0.8250),
tensor(0.8917),
tensor(1.),
tensor(1.),
tensor(1.)]
counts_end = [tensor(0.1350),
tensor(0.1467),
tensor(0.1517),
tensor(0.2233),
tensor(0.2350),
tensor(0.2417),
tensor(0.4100),
tensor(0.4200),
tensor(0.4483),
tensor(0.4600)]
跟随我了解到我需要每个列表的bottom
是之前所有列表的总和,所以我得到了这个代码:
counts_start = [torch.tensor(0.),
torch.tensor(0.),
torch.tensor(0.0050),
torch.tensor(0.0100),
torch.tensor(0.2833),
torch.tensor(0.8250),
torch.tensor(0.8917),
torch.tensor(1.),
torch.tensor(1.),
torch.tensor(1.)]
plt.bar(indices_end,counts_end, color='r')
counts_end = [torch.tensor(0.1350),
torch.tensor(0.1467),
torch.tensor(0.1517),
torch.tensor(0.2233),
torch.tensor(0.2350),
torch.tensor(0.2417),
torch.tensor(0.4100),
torch.tensor(0.4200),
torch.tensor(0.4483),
torch.tensor(0.4600)]
indices_start = range(len(counts_start))
plt.bar(indices_start,counts_start, bottom=counts_end)
plt.show()
输出
每个列表都有一个概率值,因此最大值为 1,最小值为 0,这是我需要条形图开始和结束但无法正常工作的地方。另请注意,第三列和第四列的顶部是蓝色,这使它看起来蓝色具有更高的价值(事实并非如此)。
我还尝试用 plt.bar(indices_start,[a_i - b_i for a_i, b_i in zip(counts_start, counts_end)], bottom=counts_end)
替换第二行 plt.bar
输出
这几乎是正确的(最大值为 1),除了前几列颜色错误(我认为是因为负值)。
澄清一下,我希望 2 个列表之间每列的最大值是该列的最大值。如果 counts_start
列表中有更高的值,蓝色应该在顶部显示它的值(例如 0.8917),较小的值应该是它的最大值(例如 0.4100)。所以它看起来像一个包含 0-0.4100 红色和 0.4100-0.8917 蓝色的柱子。但是,如果 counts_end
列表中有更高的值(例如 0.1517),则该列的顶部应为红色,该列的顶部为 0.1517,蓝色应为相应的值(例如0.0050)。这看起来像一列 0-0.0050 蓝色和 0.0050-0.1517 红色。
如果我没理解错的话,你想标准化你的列表值,这样 counts_start[i] + counts_end[i] == 1
.
这可以通过类似的方式完成:
start = [0, 0, 0.005, 0.01, 0.2833, 0.825, 0.8917, 1, 1, 1]
end = [0.135, 0.1467, 0.1517, 0.2233, 0.235, 0.2417, 0.41, 0.42, 0.4483, 0.46]
new_start, new_end = [], []
for x, y in zip(start, end):
t = x + y
new_start.append(x / t)
new_end.append(y / t)
n = len(start)
plt.bar(range(n), new_end, color="r")
plt.bar(range(n), new_start, bottom=new_end)
plt.show()
产生以下情节:
编辑: 好的,为此我相信您需要跟踪 4 个列表,如下所示:
start = [0, 0, 0.005, 0.01, 0.2833, 0.825, 0.8917, 1, 1, 1]
end = [0.135, 0.1467, 0.1517, 0.2233, 0.235, 0.2417, 0.41, 0.42, 0.4483, 0.46]
lo_start, hi_start, lo_end, hi_end = [], [], [], []
for x, y in zip(start, end):
if x > y:
a, b, c, d = 0, x - y, y, 0
else:
a, b, c, d = x, 0, 0, y - x
lo_start.append(a)
hi_start.append(b)
lo_end.append(c)
hi_end.append(d)
n = len(start)
offset = [max(x, y) for x, y in zip(lo_start, lo_end)]
plt.bar(range(n), lo_start, color="tab:blue")
plt.bar(range(n), lo_end, color="tab:red")
plt.bar(range(n), hi_start, bottom=offset, color="tab:blue")
plt.bar(range(n), hi_end, bottom=offset, color="tab:red")
plt.show()
产生:
我正在尝试从 2 个列表创建堆栈条形图:
counts_start = [tensor(0.),
tensor(0.),
tensor(0.0050),
tensor(0.0100),
tensor(0.2833),
tensor(0.8250),
tensor(0.8917),
tensor(1.),
tensor(1.),
tensor(1.)]
counts_end = [tensor(0.1350),
tensor(0.1467),
tensor(0.1517),
tensor(0.2233),
tensor(0.2350),
tensor(0.2417),
tensor(0.4100),
tensor(0.4200),
tensor(0.4483),
tensor(0.4600)]
跟随bottom
是之前所有列表的总和,所以我得到了这个代码:
counts_start = [torch.tensor(0.),
torch.tensor(0.),
torch.tensor(0.0050),
torch.tensor(0.0100),
torch.tensor(0.2833),
torch.tensor(0.8250),
torch.tensor(0.8917),
torch.tensor(1.),
torch.tensor(1.),
torch.tensor(1.)]
plt.bar(indices_end,counts_end, color='r')
counts_end = [torch.tensor(0.1350),
torch.tensor(0.1467),
torch.tensor(0.1517),
torch.tensor(0.2233),
torch.tensor(0.2350),
torch.tensor(0.2417),
torch.tensor(0.4100),
torch.tensor(0.4200),
torch.tensor(0.4483),
torch.tensor(0.4600)]
indices_start = range(len(counts_start))
plt.bar(indices_start,counts_start, bottom=counts_end)
plt.show()
输出
每个列表都有一个概率值,因此最大值为 1,最小值为 0,这是我需要条形图开始和结束但无法正常工作的地方。另请注意,第三列和第四列的顶部是蓝色,这使它看起来蓝色具有更高的价值(事实并非如此)。
我还尝试用 plt.bar(indices_start,[a_i - b_i for a_i, b_i in zip(counts_start, counts_end)], bottom=counts_end)
替换第二行 plt.bar
输出
这几乎是正确的(最大值为 1),除了前几列颜色错误(我认为是因为负值)。
澄清一下,我希望 2 个列表之间每列的最大值是该列的最大值。如果 counts_start
列表中有更高的值,蓝色应该在顶部显示它的值(例如 0.8917),较小的值应该是它的最大值(例如 0.4100)。所以它看起来像一个包含 0-0.4100 红色和 0.4100-0.8917 蓝色的柱子。但是,如果 counts_end
列表中有更高的值(例如 0.1517),则该列的顶部应为红色,该列的顶部为 0.1517,蓝色应为相应的值(例如0.0050)。这看起来像一列 0-0.0050 蓝色和 0.0050-0.1517 红色。
如果我没理解错的话,你想标准化你的列表值,这样 counts_start[i] + counts_end[i] == 1
.
这可以通过类似的方式完成:
start = [0, 0, 0.005, 0.01, 0.2833, 0.825, 0.8917, 1, 1, 1]
end = [0.135, 0.1467, 0.1517, 0.2233, 0.235, 0.2417, 0.41, 0.42, 0.4483, 0.46]
new_start, new_end = [], []
for x, y in zip(start, end):
t = x + y
new_start.append(x / t)
new_end.append(y / t)
n = len(start)
plt.bar(range(n), new_end, color="r")
plt.bar(range(n), new_start, bottom=new_end)
plt.show()
产生以下情节:
编辑: 好的,为此我相信您需要跟踪 4 个列表,如下所示:
start = [0, 0, 0.005, 0.01, 0.2833, 0.825, 0.8917, 1, 1, 1]
end = [0.135, 0.1467, 0.1517, 0.2233, 0.235, 0.2417, 0.41, 0.42, 0.4483, 0.46]
lo_start, hi_start, lo_end, hi_end = [], [], [], []
for x, y in zip(start, end):
if x > y:
a, b, c, d = 0, x - y, y, 0
else:
a, b, c, d = x, 0, 0, y - x
lo_start.append(a)
hi_start.append(b)
lo_end.append(c)
hi_end.append(d)
n = len(start)
offset = [max(x, y) for x, y in zip(lo_start, lo_end)]
plt.bar(range(n), lo_start, color="tab:blue")
plt.bar(range(n), lo_end, color="tab:red")
plt.bar(range(n), hi_start, bottom=offset, color="tab:blue")
plt.bar(range(n), hi_end, bottom=offset, color="tab:red")
plt.show()
产生: