How to display pictures by ggplot2, RCall and Julia in jupyter?

229 views Asked by At

I tried to use ggplot2 in julia by RCall, like example below

using DataFrames
using RCall
df = DataFrame(randn(10,2),:auto)

@rlibrary ggplot2
@rlibrary ggsci
ggplot(df, aes(x=:x1, y=:x2))+geom_point()

It works well in the REPL, but in jupyter notebook something goes wrong, as the debug info below

REvalError: Warning in (function (filename = "Rplot%03d.png", width = 480, height = 480,  :
  locale not supported by Xlib: some X ops will operate in C locale
Warning in (function (filename = "Rplot%03d.png", width = 480, height = 480,  :
  X cannot set locale modifiers
Error in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)) : 
  X11 font -adobe-helvetica-%s-%s-*-*-%d-*-*-*-*-*-*-*, face 1 at size 9 could not be loaded
Calls: <Anonymous> ... grid.Call -> <Anonymous> -> descentDetails.text -> grid.Call

Stacktrace:
  [1] handle_eval_stderr(; as_warning::Bool)
    @ RCall ~/.julia/packages/RCall/iMDW2/src/io.jl:162
  [2] rprint(io::IOContext{IOBuffer}, s::Ptr{VecSxp})
    @ RCall ~/.julia/packages/RCall/iMDW2/src/io.jl:36
  [3] rprint
    @ ~/.julia/packages/RCall/iMDW2/src/io.jl:46 [inlined]
  [4] show
    @ ~/.julia/packages/RCall/iMDW2/src/io.jl:52 [inlined]
  [5] show
    @ ./multimedia.jl:47 [inlined]
  [6] limitstringmime(mime::MIME{Symbol("text/plain")}, x::RObject{VecSxp})
    @ IJulia ~/.julia/packages/IJulia/e8kqU/src/inline.jl:43
  [7] display_mimestring
    @ ~/.julia/packages/IJulia/e8kqU/src/display.jl:71 [inlined]
  [8] display_dict(x::RObject{VecSxp})
    @ IJulia ~/.julia/packages/IJulia/e8kqU/src/display.jl:102
  [9] #invokelatest#2
    @ ./essentials.jl:708 [inlined]
 [10] invokelatest
    @ ./essentials.jl:706 [inlined]
 [11] execute_request(socket::ZMQ.Socket, msg::IJulia.Msg)
    @ IJulia ~/.julia/packages/IJulia/e8kqU/src/execute_request.jl:112
 [12] #invokelatest#2
    @ ./essentials.jl:708 [inlined]
 [13] invokelatest
    @ ./essentials.jl:706 [inlined]
 [14] eventloop(socket::ZMQ.Socket)
    @ IJulia ~/.julia/packages/IJulia/e8kqU/src/eventloop.jl:8
 [15] (::IJulia.var"#15#18")()
    @ IJulia ./task.jl:411

I tried to save the picture in pdf, png or svg format, and only pdf works well: png and svg will raise error

g = ggplot(df, aes(x=:x1, y=:x2))+geom_point()
ggsave(joinpath(odir,"try.png"),g)
REvalError: Saving 7 x 7 in image
Warning in png_dev(..., res = dpi, units = "in") :
  locale not supported by Xlib: some X ops will operate in C locale
Warning in png_dev(..., res = dpi, units = "in") :
  X cannot set locale modifiers
Error in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)) : 
  X11 font -adobe-helvetica-%s-%s-*-*-%d-*-*-*-*-*-*-*, face 1 at size 9 could not be loaded
Calls: <Anonymous> ... grid.Call -> <Anonymous> -> descentDetails.text -> grid.Call

Sup
Run corresponding codes in R works as well.

> library(ggplot2)
> df = data.frame(x1=rnorm(10),x2=rnorm(10))
> df
            x1          x2
1   0.18165143  0.38032665
2  -0.62212533  0.52412366
3   0.98072899  0.30052532
4  -0.76721485 -0.63748290
5   0.00894366  0.04508702
6  -0.33166441  0.37056327
7  -0.14156795 -1.06334665
8  -1.08918837 -0.30631348
9   0.22035254  0.78816722
10  0.00356827 -0.62542425
> ggplot(df, aes(x=x1,y=x2))+geom_point()

And it generate pictures here: plot generate by ggplot


Environments
R session

R version 4.1.1 (2021-08-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.3 LTS

Matrix products: default
BLAS:   /mnt/Storage/home/yangdongxu/softwares/R/R_4.1_installed/lib/R/lib/libRblas.so
LAPACK: /mnt/Storage/home/yangdongxu/softwares/R/R_4.1_installed/lib/R/lib/libRlapack.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] ggplot2_3.3.5

loaded via a namespace (and not attached):
 [1] magrittr_2.0.1   tidyselect_1.1.1 munsell_0.5.0    colorspace_2.0-2
 [5] R6_2.5.1         rlang_0.4.12     fansi_0.5.0      dplyr_1.0.7
 [9] grid_4.1.1       gtable_0.3.0     utf8_1.2.2       DBI_1.1.1
[13] withr_2.4.3      ellipsis_0.3.2   assertthat_0.2.1 digest_0.6.29
[17] tibble_3.1.6     lifecycle_1.0.1  crayon_1.4.2     purrr_0.3.4
[21] farver_2.1.0     vctrs_0.3.8      glue_1.5.1       labeling_0.4.2
[25] compiler_4.1.1   pillar_1.6.4     generics_0.1.1   scales_1.1.1
[29] pkgconfig_2.0.3

Julia: version 1.6.4


So what should I do to display the picture directly in jupyter like python %matplotlib inline?

Thanks.

0

There are 0 answers