【问题标题】:Matplotlib : Plotting interpolate-d part of the data with different line/marker/colorMatplotlib:用不同的线/标记/颜色绘制数据的插值-d部分
【发布时间】:2022-01-09 09:31:24
【问题描述】:

我希望能够用不同的 FMT 绘制数据中插值 d(红色圆圈)的部分。

我目前的想法是绘制 2 条线,原始且仅数据的插值 d 部分,使用不同的 FMT 来区分插值部分,使其看起来像一条奇异线。但我无法提取已被 interpolate-d 的数据,我不确定我的想法目前是否可行,或者是否有更简单的替代方案来完成它。

原始数据

                         Phoenix  Chicago
datetime                             
2012-10-02 10:00:00     30.0     63.0
2012-10-02 11:00:00     30.0     63.0
2012-10-02 12:00:00     31.0     62.0
2012-10-02 13:00:00     31.0     62.0
2012-10-02 14:00:00     32.0     62.0
2012-10-02 15:00:00     17.0     51.0
2012-10-02 16:00:00     28.0      NaN
2012-10-02 17:00:00      NaN      NaN
2012-10-02 18:00:00      9.0     42.0
2012-10-02 19:00:00      NaN      NaN
2012-10-02 20:00:00     13.0      NaN
2012-10-02 21:00:00      NaN      NaN
2012-10-02 22:00:00      7.0     48.0
2012-10-02 23:00:00      6.0     48.0
plt.plot(df[['Phoenix','Chicago']], marker = 'o')
plt.show()

插值后

                     Phoenix  Chicago
datetime                             
2012-10-02 10:00:00     30.0     63.0
2012-10-02 11:00:00     30.0     63.0
2012-10-02 12:00:00     31.0     62.0
2012-10-02 13:00:00     31.0     62.0
2012-10-02 14:00:00     32.0     62.0
2012-10-02 15:00:00     17.0     51.0
2012-10-02 16:00:00     28.0     48.0
2012-10-02 17:00:00     18.5     45.0
2012-10-02 18:00:00      9.0     42.0
2012-10-02 19:00:00     11.0     43.5
2012-10-02 20:00:00     13.0     45.0
2012-10-02 21:00:00     10.0     46.5
2012-10-02 22:00:00      7.0     48.0
2012-10-02 23:00:00      6.0     48.0
df.interpolate(inplace = True)
plt.plot(df[['Phoenix','Chicago']], marker = 'o')
plt.show()

我想要达到的目标的粗略想法

【问题讨论】:

  • 您可以为此使用 pandas 方法“interpolate”

标签: python pandas dataframe matplotlib


【解决方案1】:

由于 matplotlib 忽略了缺失数据(这通常被认为是一个问题),我们可以在这里使用这个事实,简单地将原始数据绘制在插值数据上:

from matplotlib import pyplot as plt
import pandas as pd

#recreate your data
from io import StringIO
data = """datetime                    Phoenix  Chicago                           
2012-10-02 10:00:00     30.0     63.0
2012-10-02 11:00:00     30.0     63.0
2012-10-02 12:00:00     31.0     62.0
2012-10-02 13:00:00     31.0     62.0
2012-10-02 14:00:00     32.0     62.0
2012-10-02 15:00:00     17.0     51.0
2012-10-02 16:00:00     28.0      NaN
2012-10-02 17:00:00      NaN      NaN
2012-10-02 18:00:00      9.0     42.0
2012-10-02 19:00:00      NaN      NaN
2012-10-02 20:00:00     13.0      NaN
2012-10-02 21:00:00      NaN      NaN
2012-10-02 22:00:00      7.0     48.0
2012-10-02 23:00:00      6.0     48.0"""
df = pd.read_csv(StringIO(data), sep = "\s{2,}", engine="python", parse_dates=["datetime"], na_values = "NaN")
df = df.set_index("datetime")

#interpolate and plot the interpolated data with transparency and dashed lines
dfint = df.interpolate()
plt.plot(dfint[['Phoenix','Chicago']], marker = 'o', alpha=0.5, ls="--")
#reset color cycle, so that the colors match
plt.gca().set_prop_cycle(None)
#plot again with missing data
plt.plot(df[['Phoenix','Chicago']], marker = 'o')
plt.show()

示例输出:

【讨论】:

    【解决方案2】:

    你可以使用.interpolate()方法:

    plt.plot(df[['Phoenix','Chicago']].interpolate(), marker = 'o')
    

    编辑(编辑问题后):

    如果您想同时绘制插值版本和未插值版本,您可以简单地在其上绘制未插值版本:

    plt.plot(df[['Phoenix','Chicago']].interpolate(), marker = 'x', ls="--")
    plt.plot(df[['Phoenix','Chicago']].interpolate(), marker = 'o')
    

    附言。复制数据:

    df = pd.DataFrame({"datetime": pd.period_range(start='2012-10-02 10:00:00', end='2012-10-02 23:00:00', freq='H').to_timestamp(),
                       "Phoenix": [30., 30., 31., 31., 32., 17., 28., np.nan, 9., np.nan, 13., np.nan, 7., 6.],
                       "Chicago": [63., 63., 62., 62., 62., 51., np.nan, np.nan, 42., np.nan, np.nan, np.nan, 48., 48.]})\
                           .set_index("datetime")
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 2013-09-08
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多