ggplot在一个对象中的多个图

时间:2016-09-19 09:06:56

标签: python plot python-ggplot

我创建了一个脚本来在一个对象中创建多个绘图。我正在寻找的结果是两个图,一个在另一个上,每个图具有不同的y轴刻度,但x轴是固定的 - 日期。但是,只有一个图(顶部)被正确创建,底部图是可见的但是空的,即geom_line不可见。此外,第二个图的y轴与值的范围不匹配 - 最小值到最大值。我也尝试使用facet_grid (scales="free"),但y轴没有变化。第二个图的y轴范围为0到0.05。

我将日期范围限制在过去几周。这是我正在使用的代码:

    df = df.set_index('date')
    weekly = df.resample('w-mon',label='left',closed='left').sum()
    data = weekly[-4:].reset_index()
    data= pd.melt(data, id_vars=['date'])
    pplot = ggplot(aes(x="date", y="value", color="variable", group="variable"), data)
    #geom_line()
    scale_x_date(labels = date_format('%d.%m'), 
                         limits=(data.date.min() - dt.timedelta(2),
                                 data.date.max() + dt.timedelta(2)))
    #facet_grid("variable", scales="free_y")
    theme_bw()

数据框样本(df),它是包含每个变量x和a的值的每日数据集,在这种情况下是' date'是索引:

date            x      a
2016-08-01      100    20
2016-08-02       50    0
2016-08-03       24    18
2016-08-04       0     10

数据框样本(to_plot) - 每周概述:

         date       variable  value
0  2016-08-01       x        200
1  2016-08-08       x        211
2  2016-08-15       x        104
3  2016-08-22       x        332
4  2016-08-01       a         8
5  2016-08-08       a         15
6  2016-08-15        a        22
7  2016-08-22        a        6

很抱歉没有添加df数据帧。

1 个答案:

答案 0 :(得分:2)

您对剧情指令geom_line()scale_x_date()等的调用在您的剧本中独立存在;你没有将它们连接到你的绘图对象。因此,它们对你的情节没有任何影响。

为了将绘图指令应用于现有绘图对象,请使用图形语言和"添加"通过将它们与+运算符连接,将它们添加到绘图对象中。

结果(按预期):

ggplot in python with facet_grid

完整的脚本:

from __future__ import print_function

import sys
import pandas as pd
import datetime as dt
from ggplot import *

if __name__ == '__main__':
    df = pd.DataFrame({
        'date': ['2016-08-01', '2016-08-08', '2016-08-15', '2016-08-22'],
        'x': [100, 50, 24, 0],
        'a': [20, 0, 18, 10]
    })

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

    data = pd.melt(df, id_vars=['date'])
    plt = ggplot(data, aes(x='date', y='value', color='variable', group='variable')) +\
        scale_x_date(
            labels=date_format('%y-%m-%d'), 
            limits=(data.date.min() - dt.timedelta(2), data.date.max() + dt.timedelta(2))
        ) +\
        geom_line() +\
        facet_grid('variable', scales='free_y')

    plt.show()