如何在 Jupyter 笔记本中使用 rpy2 绘制(内联)?
How to plot (inline) with rpy2 in Jupyter notebook?
我正在学习在 Jupyter notebook 中使用 rpy2。我在策划时遇到了麻烦。当我使用 rpy2 docs 中的这个示例进行交互工作时:
from rpy2.interactive import process_revents
from rpy2.robjects.packages import importr
from rpy2.robjects.vectors import IntVector
process_revents.start()
graphics = importr("graphics")
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
Jupyter 打开一个新的 window 情节。 window "title" 显示:R 图形:设备 2(活动)(无响应)。我的 Jupyter 内核处于活动状态。当我尝试用绘图关闭 window 时,windows 声称 python.exe 没有响应,如果我强制关闭,则 jupyter 内核会重新启动。
第一:我怎样才能使 rpy2 情节内联?第二:如果无法进行内联绘图,如何在 window 中获取绘图而不 python.exe 变得无响应?
看来这就是您问题的答案:https://bitbucket.org/rpy2/rpy2/issues/330/ipython-plotting-wrapper
with rpy2.robjects.lib.grdevices.render_to_bytesio(grdevices.png, width=1024, height=896, res=150) as img:
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
IPython.display.display(IPython.display.Image(data=img.getvalue(), format='png', embed=True))
这是 Christian 答案的稍微复杂的版本,它将绘图和内联嵌入包装到同一个上下文管理器中:
from contextlib import contextmanager
from rpy2.robjects.lib import grdevices
from IPython.display import Image, display
@contextmanager
def r_inline_plot(width=600, height=600, dpi=100):
with grdevices.render_to_bytesio(grdevices.png,
width=width,
height=height,
res=dpi) as b:
yield
data = b.getvalue()
display(Image(data=data, format='png', embed=True))
用法:
with r_inline_plot(width=1024, height=896, dpi=150):
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
我认为最干净的解决方案是简单地使用 %R
魔法函数。它曾经是 IPython 的一部分,但已移至 rpy2
,因此您必须先将其作为扩展加载:
%load_ext rpy2.ipython
A = np.random.normal(100)
%R -i A hist(A)
绘制直方图到 Jupyter 控制台。
我正在学习在 Jupyter notebook 中使用 rpy2。我在策划时遇到了麻烦。当我使用 rpy2 docs 中的这个示例进行交互工作时:
from rpy2.interactive import process_revents
from rpy2.robjects.packages import importr
from rpy2.robjects.vectors import IntVector
process_revents.start()
graphics = importr("graphics")
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
Jupyter 打开一个新的 window 情节。 window "title" 显示:R 图形:设备 2(活动)(无响应)。我的 Jupyter 内核处于活动状态。当我尝试用绘图关闭 window 时,windows 声称 python.exe 没有响应,如果我强制关闭,则 jupyter 内核会重新启动。
第一:我怎样才能使 rpy2 情节内联?第二:如果无法进行内联绘图,如何在 window 中获取绘图而不 python.exe 变得无响应?
看来这就是您问题的答案:https://bitbucket.org/rpy2/rpy2/issues/330/ipython-plotting-wrapper
with rpy2.robjects.lib.grdevices.render_to_bytesio(grdevices.png, width=1024, height=896, res=150) as img:
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
IPython.display.display(IPython.display.Image(data=img.getvalue(), format='png', embed=True))
这是 Christian 答案的稍微复杂的版本,它将绘图和内联嵌入包装到同一个上下文管理器中:
from contextlib import contextmanager
from rpy2.robjects.lib import grdevices
from IPython.display import Image, display
@contextmanager
def r_inline_plot(width=600, height=600, dpi=100):
with grdevices.render_to_bytesio(grdevices.png,
width=width,
height=height,
res=dpi) as b:
yield
data = b.getvalue()
display(Image(data=data, format='png', embed=True))
用法:
with r_inline_plot(width=1024, height=896, dpi=150):
graphics.barplot(IntVector((1,3,2,5,4)), ylab="Value")
我认为最干净的解决方案是简单地使用 %R
魔法函数。它曾经是 IPython 的一部分,但已移至 rpy2
,因此您必须先将其作为扩展加载:
%load_ext rpy2.ipython
A = np.random.normal(100)
%R -i A hist(A)
绘制直方图到 Jupyter 控制台。