【问题标题】:Change matplotlib subplots to seperate plots将 matplotlib 子图更改为单独的图
【发布时间】:2020-11-23 19:35:33
【问题描述】:

我有gathered a code 可以根据多天的数据绘制图表。我有一个包含超过 40 天和 19k 时间戳的数据文件,我需要一个情节,每天一个。我希望 python 将它们生成为不同的图。

先生。 T 在提供代码方面帮助了我很多,但我无法管理代码以使其绘制单个图而不是全部在一个子图中。有人可以帮我解决这个问题吗?

图片显示当前输出:

我的代码:

import matplotlib.pyplot as plt
import numpy as np
 
#read your data and create datetime index
df= pd.read_csv('test-februari.csv', sep=";") 
df.index = pd.to_datetime(df["Date"]+df["Time"].str[:-5], format="%Y:%m:%d %H:%M:%S")

#group by date and hour, count entries
dfcounts = df.groupby([df.index.date, df.index.hour]).size().reset_index()
dfcounts.columns = ["Date", "Hour", "Count"]
maxcount = dfcounts.Count.max()

#group by date for plotting
dfplot = dfcounts.groupby(dfcounts.Date)

#plot each day into its own subplot
fig, axs = plt.subplots(dfplot.ngroups, figsize=(6,8))

for i, groupdate in enumerate(dfplot.groups):
    ax=axs[i]
    #the marker is not really necessary but has been added in case there is just one entry per day
    ax.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="blue", marker="o")
    ax.set_title(str(groupdate))
    ax.set_xlim(0, 24)
    ax.set_ylim(0, maxcount * 1.1)
    ax.xaxis.set_ticks(np.arange(0, 25, 2))

plt.tight_layout()
plt.show()

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    欢迎来到 Stackoverflow。

    您可以动态创建图形并在每个循环中分别在其上绘制,而不是创建多个子图。最后同时显示所有这些。

    for groupdate in dfplot.groups:
        fig = plt.figure()
        plt.plot(groupdate.Hour, groupdate.Count, color="blue", marker="o")
        plt.title(str(groupdate))
        plt.xlim(0, 24)
        plt.ylim(0, maxcount * 1.1)
        plt.xticks(np.arange(0, 25, 2))
    
    plt.tight_layout()
    plt.show()
    

    【讨论】:

    • 谢谢! @enesdemirag。我还可以根据特定图的最大值更改大小(最大值 y 值)吗?
    • @peter 是的。 y 轴的默认限制已经比最大值高一点。您还可以添加plt.ylim() 以随意缩放。
    • 谢谢,我只有所有图表中的最大值设置为最大值。我想要每个单独图表的最大值。有一个简单的功能吗?有些情节到 20,有些到 80。如果我想让它随着情节本身而改变?
    • 这是经过深思熟虑的,彼得,为了图表之间的可比性。从循环中删除plt.ylim(),matplotlib 会自动缩放 y 轴。但是,不断变化的 y 轴刻度可能会欺骗您的眼睛并导致错误的结论。
    • OP 从更明确的 matplotlib 面向对象接口开始,所以我认为答案也应该如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多