matplotlib 循环,用于在一个嵌套框中绘制唯一值

2izufjch  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(167)

我需要你的帮助来绘制一个图表中的每个项目的一个框架(“事件”列)。我创建了一个循环,虽然结果带来了图形的数量和标题正确的期望,图形线考虑整个框架的值,不考虑过滤器中的“for - in”

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame()
df['Date']=['2023-07-01', '2023-07-02','2023-07-03','2023-07-04','2023-07-05','2023-07-01', '2023-07-02','2023-07-03','2023-07-04','2023-07-05']
df['Event']=['abc','def','abc','def','abc','def','abc','def','abc','def']
df['Value']=[43,12,19,45,34,21,21,45,38,14]

eve = df['Event'].unique()
for q in eve:
    plt.figure(figsize=(10,6))
    plt.plot(df['Date'],df['Value'], marker='o', linestyle='-', label='Value')
    plt.xticks(rotation=90)
    plt.title(q, fontsize=18)
    plt.show()
plt.close()

字符串
前两个图像是获得的输出,最后两个图是期望的输出。
100d 1xx 1c 1d 1x的字符串



au9on6nz

au9on6nz1#

如果你删除.sort_values(by=['Date']),这会产生你想要的图,但对我来说,在x轴上有随机日期似乎很奇怪。尽管这种方法是“干净”的,但它效率极低,不能很好地处理较大的数据集。如果性能有问题,请告诉我,这样我就可以给你一个更优化的版本。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame()
df['Date']=['2023-07-01', '2023-07-02','2023-07-03','2023-07-04','2023-07-05','2023-07-01', '2023-07-02','2023-07-03','2023-07-04','2023-07-05']
df['Event']=['abc','def','abc','def','abc','def','abc','def','abc','def']
df['Value']=[43,12,19,45,34,21,21,45,38,14]

unique_events = df['Event'].unique()
for event in unique_events:
    temp = df[df['Event']==event].sort_values(by=['Date'])
    plt.figure(figsize=(10,6))
    plt.plot(temp['Date'],temp['Value'], marker='o', linestyle='-', label='Value')
    plt.xticks(rotation=90)
    plt.title(event, fontsize=18)
    plt.show()

字符串
编辑:基于查找表的方法:

from collections import defaultdict

events_dict = defaultdict(list)
di = df.to_dict()

for row, event in di['Event'].items():
    events_dict[event].append((di['Date'][row], di['Value'][row]))

for event in events_dict:
    plt.figure(figsize=(10,6))
    x,y = zip(*sorted(events_dict[event]))
    plt.plot(x, y, marker='o', linestyle='-', label='Value')
    plt.xticks(rotation=90)
    plt.title(event, fontsize=18)
    plt.show()


性能差异:

如前所述,在小数据集上,这并不重要,但如果您处理数十万或数百万行,差异就会迅速增加

相关问题