Создание сюжета с использованием plotnine python из R через сетчатый

Будучи пользователем R, я учусь включать команду python в R через reticulate, я пытался построить график с использованием пакета plotnine в R, но он вернул следующую ошибку, может ли кто-нибудь помочь?

library(reticulate)
library(ggplot2)

pd <- import('pandas', as='pd',convert=FALSE)
p9 <- import('plotnine')

mpg_py <- r_to_py(mpg,convert=FALSE)
mpg_pd <- pd$DataFrame(data=mpg_py)

p9$ggplot(data=mpg_pd,p9$aes(x='displ',y='cty'))

# Error in py_call_impl(callable, dots$args, dots$keywords) : 
#   AttributeError: 'NoneType' object has no attribute 'f_locals'

person lokheart    schedule 29.12.2020    source источник


Ответы (1)


Ответ на этот вопрос указал мне многообещающий путь для этой ошибки. Кажется, ошибка связана с проблемой в пакете patsy, который обрабатывает пространство имен/область действия для plotnine. По умолчанию конструктор plotnine.ggplot создает среду, чтобы знать, где взять графические данные и эстетику. Итак, адаптируя связанный ответ, вот потенциальное решение, в котором мы импортируем пакет patsy и используем параметр environment в функции ggplot для передачи среды оценки (документы).

library(reticulate)
library(ggplot2)


pd = import('pandas',convert=F)
p9 = import('plotnine')
# new imports
patsy = import('patsy')
  # import to be able to show in RStudio (see issue here: https://github.com/rstudio/rstudio/issues/4978)
matplotlib = import('matplotlib')
matplotlib$use('tkAgg')
plt = import('matplotlib.pyplot')

mpg_py <- r_to_py(mpg,convert=FALSE)
mpg_pd <- pd$DataFrame(data=mpg_py)

plot_py = p9$ggplot(mpg_pd,p9$aes(x='displ',y='cty'),
                    # new code (-1 was the only value that didn't throw an error)
          environment = patsy$EvalEnvironment$capture(eval_env=as.integer(-1)))
print(class(plot_py)) # "plotnine.ggplot.ggplot" "python.builtin.object"

# Actually show the plot
plot_py
plt$show()
person cookesd    schedule 30.12.2020