matplotlib 显示唯一栏的特殊值

xqk2d5yq  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(100)

我试图创建“能力图”的生产目标。
此图表包括有关“计划值”、“当前值”和“延迟单位”的信息。黄色条是“计划”,每个条都是静态的。绿色条是当前值,显示此时生产了多少件。最后一个是“延迟单位”。如果单位生产得太晚-则变为红色。
举个例子:第45周生产需要300个单位,生产了62个(包括10个后期单位),第45周生产了10个单位,但应该在第44周生产,这就是为什么现在变成红色。
我的问题是:我怎么能只在第45周添加红色条?而不是在整个图上的每个条上。现在我有这样的结果:x1c 0d1x
我可以改变代码,得到这样的图表,但这样我就失去了周数。

import matplotlib.pyplot as plt
import numpy as np

plt.figure('Capacity chart 2023')

# create data
x = [42,43,44,45]
y1 = np.array(300) # plan
y2 = np.array([172, 132, 189, 62]) # fact
y3 = np.array(10) # late

# plot bars in stack manner
plt.bar(x, y1, color='yellow', align="center", tick_label=x) # plan
plt.bar(x, y2, color='green', align="center", tick_label=x) # fact
plt.bar(x, y3, color='red', align="center", tick_label=x) # late

ax = plt.gca()
for container in ax.containers:
    plt.bar_label(container)

plt.title('Capacity chart 2023')
plt.ylabel('Units amount')
plt.xlabel('Week number')
plt.legend(["Plan value", "Current value", "Late units"], loc="upper right")
plt.get_current_fig_manager().window.state('zoomed')

plt.show()

如果我添加新列表:

i = [45,45,45,45]

并更改红色条的x位置:

plt.bar(i, y3, color='red', align="center", tick_label=x) # late

我只在第45周得到了红条,但就像我上面说的,我失去了周数。
有没有可能的方法来显示3堆叠酒吧不是在每个酒吧,但只有当它需要?

cigdeys3

cigdeys31#

我不确定我是否完全理解。你可以在“当前值”上绘制“迟到单位”条,只有在“迟到单位”存在的地方。下面是示例代码:

import matplotlib.pyplot as plt
import numpy as np

plt.figure('Capacity chart 2023')

x = [42, 43, 44, 45]
y1 = np.array([300, 200, 250, 300])
y2 = np.array([172, 132, 189, 62])
late_units = np.array([0, 0, 0, 10])

# Plot the "plan value" bars
plt.bar(x, y1, color='yellow', align="center", label="Plan value")

# Plot the "current value" bars on top of "plan value"
plt.bar(x, y2, color='green', align="center", label="Current value", bottom=y1)

# Plot the "late units" bars on top of "current value"
for week, late_units_count in zip(x, late_units):
    if late_units_count > 0:
        plt.bar(week, late_units_count, color='red', align="center", label="Late units")

plt.title('Capacity chart 2023')
plt.ylabel('Units amount')
plt.xlabel('Week number')
plt.legend(loc="upper right")
plt.xticks(x)

plt.show()

相关问题