首页 > 解决方案 > 如何使用 Plotly 绘制多个图表,其中每个图表针对不同的(下一天)?

问题描述

我想分别按天绘制机器观察数据,

因此电流、温度等之间的变化可以按小时查看。

基本上我每天都想要一个情节。问题是当我制作太多这些 Jupyter Notebook 时,无法显示它们中的每一个,并且会产生错误。

f_day --> 第一天

n_day --> 第二天

我想使用带有共享 y 轴的 sub_plots 但是我不知道如何在 x 轴上放置不同的日期

如何使用图形对象和 sub_plots 制作这些?因此,因此仅使用 1 个图形对象,因此绘图不会崩溃。

数据看起来像这样

    ,ID,IOT_ID,DATE,Voltage,Current,Temperature,Noise,Humidity,Vibration,Open,Close
0,9466,5d36edfe125b874a36c6a210,2020-08-06 09:02:00,228.893,4.17,39.9817,73.1167,33.3133,2.05,T,F
1,9467,5d36edfe125b874a36c6a210,2020-08-06 09:03:00,228.168,4.13167,40.0317,69.65,33.265,2.03333,T,F
2,9468,5d36edfe125b874a36c6a210,2020-08-06 09:04:00,228.535,4.13,40.11,71.7,33.1717,2.08333,T,F
3,9469,5d36edfe125b874a36c6a210,2020-08-06 09:05:00,228.597,4.14,40.1683,71.95,33.0417,2.0666700000000002,T,F
4,9470,5d36edfe125b874a36c6a210,2020-08-06 09:06:00,228.405,4.13333,40.2317,71.2167,32.9933,2.0,T,F

显示错误的代码是这个

f_day = pd.Timestamp('2020-08-06 00:00:00')

for day in range(days_between.days):

    
    n_day = f_day + pd.Timedelta('1 days')

    fig_df = df[(df["DATE"] >= f_day) & (df["DATE"] <= n_day) & (df["IOT_ID"] == iot_id)]

    fig_cn = px.scatter(
                        fig_df, x="DATE", y="Current", color="Noise", color_continuous_scale= "Sunset",
                        title= ("IoT " + iot_id + " " + str(f_day.date())),
                        range_color= (min_noise,max_noise)
                     )

    f_day = n_day

    fig_cn.show()

标签: pythonpandasdatetimejupyter-notebookplotly

解决方案


更新

问题是关于情节而不是matplotlib。同样的方法有效。显然轴和标题需要一些美化

import pandas as pd
import plotly.subplots
import plotly.express as px
import datetime as dt
import random

df = pd.DataFrame([{"DATE":d, "IOT_ID":random.randint(1,5), "Noise":random.uniform(0,1), "Current":random.uniform(15,25)}
             for d in pd.date_range(dt.datetime(2020,9,1), dt.datetime(2020,9,4,23,59), freq="15min")])

# get days to plot
days = df["DATE"].dt.floor("D").unique()
# create axis for each day
fig = plotly.subplots.make_subplots(len(days))

iot_id=3
for i,d in enumerate(days):
    # filter data and plot ....
    mask = (df["DATE"].dt.floor("D")==d)&(df["IOT_ID"]==iot_id)
    splt = px.scatter(df.loc[mask], x="DATE", y="Current", color="Noise", color_continuous_scale= "Sunset",
                        title= f"IoT ({iot_id}) Date:{pd.to_datetime(d).strftime('%d %b')}")
    # select_traces() returns a generator so turn it into a list and take first one
    fig.add_trace(list(splt.select_traces())[0], row=i+1, col=1)

fig.show()

在此处输入图像描述

这很简单 - 首先创建要绘制的轴。然后情节。正如您在问题中未提供的那样,我已经模拟了您的数据。

import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
import random

df = pd.DataFrame([{"DATE":d, "IOT_ID":random.randint(1,5), "Noise":random.uniform(0,1), "Current":random.uniform(15,25)}
             for d in pd.date_range(dt.datetime(2020,9,1), dt.datetime(2020,9,4,23,59), freq="15min")])


# get days to plot
days = df["DATE"].dt.floor("D").unique()
# create axis for each day
fig, ax = plt.subplots(len(days), figsize=[20,10],
                      sharey=True, sharex=False, gridspec_kw={"hspace":0.4})

iot_id=3
for i,d in enumerate(days):
    # filter data and plot ....
    df.loc[(df["DATE"].dt.floor("D")==d)&(df["IOT_ID"]==iot_id),].plot(kind="scatter", ax=ax[i], x="DATE", y="Current", c="Noise", 
                                              colormap= "turbo", title=f"IoT ({iot_id}) Date:{pd.to_datetime(d).strftime('%d %b')}")
    ax[i].set_xlabel("") # it's in the titles...

输出 在此处输入图像描述


推荐阅读