是否可以在R ggplot中将自定义图像(例如png格式)显示为geom_point?
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")) +
给出错误:
不知道如何自动为类型对象选取比例 原型/环境。默认为连续错误:美学必须 长度为 1,或与 dataProblem:(annotation_raster(conv_pic, xmin = 0, ymin = 0, xmax = 5,ymax = 5))
点几何用于创建散点图,似乎不是为了满足您的需求而设计的,即显示自定义图像。但是,这里回答了一个类似的问题,这表明可以通过以下步骤解决问题:
(1)读取要显示的自定义图像,
(2) 使用 rasterGrob()
函数在给定位置、大小和方向渲染栅格对象,
(3)使用绘图功能如qplot()
,
(4) 使用 geom (如 annotation_custom()
)用作静态注释,指定 user20650 提到的 x 和 y 极限的粗略调整。
使用下面的代码,我可以得到两个自定义图像img1.png和img2.png分别位于给定的xmin,xmax,ymin和ymax。
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()
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()