#ggplot2 #julia
#ggplot2 #Джулия
Вопрос:
Я работаю с Плутоном.записная книжка jl. Я хотел бы использовать библиотеку ggplot2 R для создания некоторых графиков.
Следуя этому примеру, если я выполню следующий код в Julia REPL, я смогу получить вывод графика ggplot2.
using RCall
@rlibrary ggplot2
using DataFrames
df = DataFrame(v = [3,4,5], w = [5,6,7], x = [1,2,3], y = [4,5,6], z = [1,1,2])
ggplot(df, aes(x=:x,y=:y)) geom_line()
Теперь, когда я использую тот же код в pluto.записная книжка jl (каждая строка представляет собой отдельную ячейку), затем я получаю следующее сообщение об ошибке:
Есть ли способ заставить изображение ggplot2 отображаться внутри записной книжки pluto?
Аналогично, если я просто вхожу ggplot()
в ячейку, я получаю ту же ошибку, но ggplot not defined
.
Ответ №1:
С @library
помощью Pluto.jl, похоже, не удается найти пакет R.
Однако Pluto может обрабатывать этот формат:
@rimport ggplot2 as ggplot2
Мне удалось увидеть картинку после нажатия кнопки «воспроизвести» 3 или 4 раза. На этом хорошие новости заканчиваются — интеграция Plut-RCall нестабильна. График отображается в отдельном окне, которое, кажется, зависает — возможно, это история для открытия проблемы.
Однако то, что вы можете попытаться сделать, это сохранить изображение в файл, а затем визуализировать его:
begin
ggplot2.ggplot(df, ggplot2.aes(x=:x, y=:y)) ggplot2.geom_line()
ggplot2.ggsave("myplot.png")
im1 = Images.load("myplot.png")
end
Ответ №2:
В качестве обходного пути можно переопределить Base.show
вручную (см. Pluto.jl/sample/test1.jl) с помощью
function Base.show(io::IO, ::MIME"image/png", p::RObject{VecSxp})
(path, _) = mktemp()
R"ggsave($path, plot=$p, device = 'png')"
im = read(path)
rm(path)
write(io, im)
end
После этого в ячейках, которые выводят что-либо подобного типа RObject{VecSxp}
, будет отображаться изображение PNG:
Комментарии:
1. Небольшое предупреждение: другие методы также
RObject{VecSxp}
, но не графики, например, списки. Поэтому перегрузкаshow
нарушает отображение этих других объектов.