web-dev-qa-db-ja.com

カスタム画像をgeom_pointとして表示する

R ggplotでgeom_pointとしてカスタム画像(たとえばpng形式)を表示することは可能ですか?

library(png)
pic1 <- readPNG("pic1.png")

png("Heatmap.png", units="px", width=3200, height=3200, res=300)
ggplot(data_frame, aes(medium, day, fill = Transactions))  +
   geom_tile(colour="white")  +
   facet_grid(dime3_year~dime3_month) + 
   scale_fill_gradient(high="blue",low="white") +
   theme_bw() + 
   geom_point(aes(dime3_channel, day, size=Conv,alpha=Conv,image=(annotation_raster(pic1,xmin=0,ymin=0,xmax=5,ymax=5)),color="firebrick")) +

エラーが発生します:

タイプproto/environmentのオブジェクトのスケールを自動的に選択する方法がわかりません。デフォルトの連続エラー:美学は長さ1、またはデータと同じ長さである必要があります問題:(annotation_raster(conv_pic、xmin = 0、ymin = 0、xmax = 5、ymax = 5))

21
Seth

ポイントジオメトリは散布図を作成するために使用され、必要なこと、つまりカスタム画像を表示するようには設計されていないようです。ただし、同様の質問に回答しました ここ これは、次の手順で問題を解決できることを示しています。

(1)表示したいカスタム画像を読み、

(2)rasterGrob()関数を使用して、指定された場所、サイズ、および方向でラスターオブジェクトをレンダリングします。

(3)qplot()などのプロット関数を使用します。

(4)annotation_custom()などのgeomを使用して、user20650で言及されているxおよびy制限の大まかな調整を指定する静的注釈として使用します。

以下のコードを使用して、指定されたxmin、xmax、ymin、およびymaxに配置された2つのカスタム画像img1.pngとimg2.pngを取得できます。

library(png)
library(ggplot2)
library(gridGraphics)
setwd("c:/MyFolder/")

img1 <- readPNG("img1.png")
img2 <- readPNG("img2.png")
g1 <- rasterGrob(img1, interpolate=FALSE)
g2 <- rasterGrob(img2, interpolate=FALSE)
qplot(1:10, 1:10, geom="blank") + 
  annotation_custom(g1, xmin=1, xmax=3, ymin=1, ymax=3) +
  annotation_custom(g2, xmin=7, xmax=9, ymin=7, ymax=9) +  
  geom_point()
12
deb2015

これは、_geom_point_内で必要なことを完全には実行しませんが、おそらく迅速な代替案を示唆しています。ただし、xおよびyの制限に対するかなり大雑把な調整が含まれています。

_library(png)
library(ggplot2)

img <- readPNG(system.file("img", "Rlogo.png", package="png"))

ggplot(mtcars, aes(mpg, wt)) + 
       geom_blank() +
       mapply(function(xx, yy) 
          annotation_raster(img, xmin=xx-1, xmax=xx+1, ymin=yy-0.2, ymax=yy+0.2),
          mtcars$mpg, mtcars$wt) 
_

enter image description here

ファセットについては、mapply関数を変更する方法について Kohskeの回答 を参照してください。

[〜#〜]編集[〜#〜]

Debの答えのように、これは実際にはannotation_custom()を使用するとより良くレンダリングされると思います。以下では、個々のannotation_custom呼び出しを使用するのではなく、すべてのポイントをループできます。上からのわずかな変更は、grobの名前を変更する必要があるように見えることです( リンクからのコメント

_g <- rasterGrob(img, interpolate=FALSE)

ggplot(mtcars, aes(mpg, wt)) + 
          geom_blank() +
          mapply(function(xx, yy, ii) {
          g$name <- ii
          annotation_custom(g, xmin=xx-1, xmax=xx+1, ymin=yy-0.2, ymax=yy+0.2)},
          mtcars$mpg, mtcars$wt, seq_len(nrow(mtcars))) 
_
13
user20650

DL Millerは、ggproto(). https://github.com/dill/emoGG を使用して別のソリューションを提供しました

library(ggplot2)
library(grid)
library(EBImage)
img <- readImage(system.file("img", "Rlogo.png", package = "png"))
RlogoGrob <- function(x, y, size, img) {
    rasterGrob(x = x, y = y, image = img, default.units = "native", height = size, 
        width = size)
}

GeomRlogo <- ggproto("GeomRlogo", Geom, draw_panel = function(data, panel_scales, 
    coord, img, na.rm = FALSE) {
    coords <- coord$transform(data, panel_scales)
    ggplot2:::ggname("geom_Rlogo", RlogoGrob(coords$x, coords$y, coords$size, 
        img))
}, non_missing_aes = c("Rlogo", "size"), required_aes = c("x", "y"), default_aes = aes(size = 0.05), 
    icon = function(.) {
    }, desc_params = list(), seealso = list(geom_point = GeomPoint$desc), 
    examples = function(.) {
    })

geom_Rlogo <- function(mapping = NULL, data = NULL, stat = "identity", 
    position = "identity", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, 
    ...) {
    layer(data = data, mapping = mapping, stat = stat, geom = GeomRlogo, 
        position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
        params = list(na.rm = na.rm, img = img, ...))
}
ggplot(mtcars, aes(wt, mpg))+geom_Rlogo()
7
Dr Duck