- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 rpy2 包从 python 脚本调用 ggplot2 来绘制时间序列数据。当我尝试调整 x 刻度的日期限制时出现错误。 rpy2 文档提供了此指导 ( https://rpy2.readthedocs.io/en/version_2.8.x/vector.html?highlight=date%20vector ):“日期或时间点的序列可以存储在 POSIXlt
或 POSIXct
对象中。两者都可以从 Python 序列创建time.struct_time
对象或来自 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))
当我运行此代码时,收到以下错误消息:
错误:输入无效:date_trans 仅适用于 Date 类的对象
我还尝试了 DateVector
对象,而不是 POSIXct
对象。我还尝试使用 base.as_Date()
将日期字符串转换为 R 日期并将其输入 R 向量对象中。我总是收到相同的错误消息。在 R 中,我会像这样更改比例限制:
gp + scale_x_date(limits = as.Date(c("2000/01/01", "2010/01/01"))
如何将其转换为 rpy2 以便我的 python 脚本能够运行?
最佳答案
考虑像在 R 中一样运行基本 R 函数,您可以将其作为库导入到 rpy2 中。仅供引用 - 在 R session 中,base
、stats
、utils
和其他内置库是隐式加载的,无需 library
行.
日期时间处理
此外,使用 strftime
而不是 timetuple()
将 Python 日期时间对象转换为字符串,以便更容易翻译。
base = importr('base')
...
date_min = dt.datetime(2000, 1, 1).strftime('%Y-%m-%d')
date_max = dt.datetime(2010, 1, 1).strftime('%Y-%m-%d')
date_range = base.as_POSIXct(base.c(date_min, date_max), format="%Y-%m-%d")
...
ggplot2.scale_x_datetime(limits=date_range))
GGPlot Plus 运算符
此外,+
Python 运算符与 ggplot2 的运算符不太一样,实际上是:ggplot2:::`+.gg`
。正如这篇 SO 文章中指出的,How is ggplot2 plus operator defined? ,此函数有条件地运行您需要在 Python 中复制的 add_theme()
或 add_ggplot()
。由于上述 R 函数是本地命名空间,在 ggplot2.* 调用时不易使用,因此使用 R 的 utils::getAnywhere("+.gg") 将该函数导入为用户定义的方法。
因此,您需要将 +
转换为 Python 对象模型的实际限定调用。您可以使用基础 R 的 Reduce
来做到这一点。所以 R 中的以下内容:
gp <- ggplot(df)
gp <- gp + aes_string(x='Time', y='Data') +
geom_point() +
scale_x_datetime(limits=date_range)
相当于翻译为
gp <- Reduce(ggplot2:::`+.gg`, list(ggplot(df), aes_string(x='Time', y='Data'),
geom_point(), scale_x_datetime(limits=date_range)))
或者在 session 中加载ggplot2库后使用getAnywhere()
:
gg_proc <- getAnywhere("+.gg")
gp <- Reduce(gg_proc$objs[[1]], list(ggplot(df), aes_string(x='Time', y='Data'),
geom_point(), scale_x_datetime(limits=date_range)))
<小时/>
Rpy2
下面是 rpy2 中的完整代码。因为您以非交互方式运行在 Python 脚本中分层的 R 对象,所以绘图不会显示在屏幕上,并且需要保存,这可以通过 ggsave 来实现:
import numpy as np
import pandas as pd
import datetime as dt
from rpy2.robjects import pandas2ri
from rpy2.robjects.packages import importr
# IMPORT R PACKAGES
base = importr('base')
utils = importr('utils')
ggplot2 = importr('ggplot2')
pandas2ri.activate()
# CREATE RANDOM (SEEDED) DATAFRAME WITH TIME SERIES DATA
np.random.seed(6252018)
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)]})
# CONVERT TO POSIXct VECTOR
date_min = dt.datetime(2000, 1, 1).strftime('%Y-%m-%d')
date_max = dt.datetime(2010, 1, 1).strftime('%Y-%m-%d')
date_range = base.as_POSIXct(base.c(date_min, date_max), format="%Y-%m-%d")
# RETRIEVE NEEDED FUNCTION
gg_plot_func = utils.getAnywhere("+.gg")
# PRODUCE PLOT
gp = base.Reduce(gg_plot_func[1][0], base.list(ggplot2.ggplot(df),
ggplot2.aes_string(x='Time', y='Data'),
ggplot2.geom_point(),
ggplot2.scale_x_datetime(limits=date_range)))
# SAVE PLOT TO DISK
ggplot2.ggsave(filename="myPlot.png", plot=gp, device="png", path="/path/to/plot/output")
输出 (用 Python 渲染)
关于python - rpy2 ggplot2错误: Invalid input: date_trans works with objects of class Date only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51030958/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!