【发布时间】:2018-12-04 11:18:14
【问题描述】:
我正在尝试使用 rpy2 包从 python 脚本调用 ggplot2 来绘制时间序列数据。当我尝试调整 x 刻度的日期限制时出现错误。 rpy2 文档提供了此指南 (https://rpy2.readthedocs.io/en/version_2.8.x/vector.html?highlight=date%20vector):“日期或时间点的序列可以存储在 POSIXlt 或 POSIXct 对象中。两者都可以从 time.struct_time 对象的 Python 序列或 R 对象中创建。”
这是我的示例代码:
import numpy as np
import pandas as pd
import datetime as dt
from rpy2 import robjects as ro
from rpy2.robjects import pandas2ri
import rpy2.robjects.lib.ggplot2 as ggplot2
pandas2ri.activate()
#Create a random dataframe with time series data
df = pd.DataFrame({'Data': np.random.normal(50, 5, 10),
'Time': [dt.datetime(2000, 7, 23), dt.datetime(2001, 7, 15),
dt.datetime(2002, 7, 30), dt.datetime(2003, 8, 5),
dt.datetime(2004, 6, 28), dt.datetime(2005, 7, 23),
dt.datetime(2006, 7, 15), dt.datetime(2007, 7, 30),
dt.datetime(2008, 8, 5), dt.datetime(2009, 6, 28)]})
#Create a POSIXct vector from time.struct_time objects to store the x limits
date_min = dt.datetime(2000, 1, 1).timetuple()
date_max = dt.datetime(2010, 1, 1).timetuple()
date_range = ro.vectors.POSIXct((date_min, date_max))
#Generate the plot
gp = ggplot2.ggplot(df)
gp = (gp + ggplot2.aes_string(x='Time', y='Data') +
ggplot2.geom_point() +
ggplot2.scale_x_date(limits=date_range))
当我运行此代码时,我收到以下错误消息:
Error: Invalid input: date_trans works with objects of class Date only
除了POSIXct 对象,我还尝试了DateVector 对象。我还尝试使用base.as_Date() 将日期字符串转换为 R 日期并将它们输入到 R 矢量对象中。我总是收到相同的错误消息。在 R 中,我会像这样更改比例限制:
gp + scale_x_date(limits = as.Date(c("2000/01/01", "2010/01/01"))
如何将它翻译成 rpy2 以便我的 python 脚本能够运行?
【问题讨论】:
-
这是一个非常有趣的问题,帮助我了解了 R 的一些内部知识!您正在使用 Python 的
+运算符,它不是 ggplot2 的+!将立即发布答案。