在python中使用不同的时间索引在同一X轴上绘制多个直方图

2024-05-13 23:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个关于三个事件(s,c,I)的概率列表,这三个事件是我随时间1-1000获得的,即pr_s, pr_c, pr_i。 在时间t时,只有一个事件为真。我想用不同的颜色在时间索引的x轴上绘制所有三个事件(pr_s, pr_c, pr_i)的值,但我不确定如何做到这一点。我想知道在时隙t发生了什么事件,概率有多大

例如,假设事件发生在tt+5之间,如下所示:

pr_c(t) = 0.4; 
pr_i(t+1) = 0.3; 
pr_c(t+2) = 0.8; 
pr_s(t+3) = 0.65; 
pr_i(t+4) = 0.6; 
pr_s(t+5) = 0.9;

我想把这些概率画在y轴上,时间是x轴。现在,我有一个发生概率的列表。例如,在上述示例中,pr_i = [0.3, 0.6]发生在t+1t+4时间

编辑:它可能需要我使用循环和if-else语句进行绘图,但我不确定我是否能做到这一点以及如何做到这一点


Tags: 编辑绘图示例列表if颜色时间绘制
2条回答

也许这会有帮助。听起来你可能需要一个折线图。剩下的你需要查阅文档。但是这段代码将把数据放入一个数据框中,然后你就可以像绘制时间序列一样绘制了

https://matplotlib.org/
https://stackoverflow.com/questions/28931224/adding-value-labels-on-a-matplotlib-bar-chart

import pandas as pd
import matplotlib.pyplot as plt

pr_s = [10,21,33]
pr_c = [20,11,16]
pr_i = [30,31,42]

df = pd.DataFrame(np.reshape(list(zip(pr_s, pr_c, pr_i)),(-1,3)))

plt.xticks(range(0, len(df.columns)))

plt.legend(loc='upper left')
plt.plot(df,marker='o')
plt.xlabel('Time')
plt.ylabel('Probabilities')

我仍然不完全清楚您希望如何提供t和事件pr_s, pr_c, pr_i之间的连接,但这里有两种解决方案。一个是使用基本Python和matplotlib,另一个是使用pandas/seaborn作为高级库

from matplotlib import pyplot as plt

pr_i = [0.3, 0.6]
pr_c = [0.4, 0.8]
pr_s = [0.65, 0.9]

t = ["c", "i", "c", "s", "i", "s"]

event_dict = {"c": pr_c, "i": pr_i, "s": pr_s}

fig, (ax1, ax2) = plt.subplots(2, figsize=(6, 10))

for key in event_dict.keys():
    ind = [i for i, x in enumerate(t) if x==key]
    ax1.bar(ind, event_dict[key], label=key)
    
ax1.legend()
ax1.set_title("List solution")


import pandas as pd
import seaborn as sns

df = pd.DataFrame({"t": t, "vals": 0})

for key in event_dict.keys():
    df.loc[df.t==key, "vals"] = event_dict[key]

sns.barplot(x=df.index, y=df.vals, hue=df.t, dodge=False, ax=ax2, palette="bright")
ax2.set_title("Pandas/seaborn solution")

plt.show()

样本输出:

![enter image description here

相关问题 更多 >