分割数据并使用Python用实线和虚线绘制它们

时间:2019-12-05 02:44:54

标签: python pandas matplotlib plotly seaborn

我想将以下数据分为两部分:observed2018-092019-11predicted2019-12到日期结束列,用matplotlibplotlyseaborn等分别用实线和虚线绘制它们。

       date             price    pct
0   2018-09      10.599  0.020
1   2018-10      10.808  0.020
2   2018-11      10.418 -0.036
3   2018-12      10.166 -0.024
4   2019-01       9.995 -0.017
5   2019-02      10.663  0.067
6   2019-03      10.559 -0.010
7   2019-04      10.055 -0.048
8   2019-05      10.691  0.063
9   2019-06      10.766  0.007
10  2019-07      10.667 -0.009
11  2019-08      10.504 -0.015
12  2019-09      10.284 -0.021
13  2019-10      10.047 -0.023
14  2019-11       9.717 -0.033
15  2019-12       9.908 -0.029
16  2020-01       9.570 -0.045
17  2020-02       9.754 -0.023
18  2020-03       9.779 -0.025
19  2020-04       9.777 -0.031
20  2020-05       9.932 -0.020

我尝试过如下代码,首先出现错误,其次我还没有绘制pct。有人可以帮忙吗?谢谢。

df = df.set_index('date')
plt.plot('date', 'price', data=df.loc['2018-09':'2019-11'], marker='o', color='green', linewidth=2)
plt.plot('date', 'price', data=df.loc['2019-12':], marker='o', color='green', linewidth=2, linestyle = '--')

它会生成ValueError: x and y must have same first dimension, but have shapes (1,) and (15,)

编辑:此代码已成功绘制price的图,但我需要在同一图上绘制pct

df['date'] = pd.to_datetime(df['date'])

# https://stackoverflow.com/questions/46230864/split-dataframe-on-the-basis-of-date
split_date ='2019-12-01'
plt.figure(figsize=(10, 5))
plt.plot('date', 'rent_price', data = df.loc[df['date'] <= split_date], marker='o', color='red', linewidth=2)
plt.plot('date', 'rent_price', data = df.loc[df['date'] >= split_date], marker='o', color='green', linewidth=2, linestyle = '--')

2 个答案:

答案 0 :(得分:2)

我认为最好使用这样的图来说明您所描述的内容:

enter image description here

完整代码:

    /**  
     * @param dir The directory to list.
     * @return A list of files and directories in dir.
     * @throws IOException If encountered.
     */
    public static List<Path> getList(Path dir) throws IOException {
        try (Stream<Path> s = Files.list(dir)) {
            return s.collect(Collectors.toList());
        }
    }

答案 1 :(得分:1)

如果尺寸不同,可以尝试使用子图单独打印数据。 matplotlib网站上有子图的文档和教程。

df = df.set_index('date')
plt.subplot(211)
plt.plot('date', 'rent_price', data=df.loc['2018-09':'2019-11'], marker='o', color='green', linewidth=2)
plt.xlabel('Observed')
plt.subplot(212)
plt.plot('date', 'rent_price', data=df.loc['2019-12':], marker='o', color='green', linewidth=2, linestyle = '--')
plt.xlabel('Predicted')
plt.show()