- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一位学生问我是否可以使用 R 重新创建类似于下面的图:
这是来自this paper....
这类东西不是我的专长,但使用以下代码我能够创建 95% CI 椭圆并使用 geom_polygon()
绘制它们。我使用 rphylopic
包从系统库中抓取的图像填充了图像。
#example data/ellipses
set.seed(101)
n <- 1000
x1 <- rnorm(n, mean=2)
y1 <- 1.75 + 0.4*x1 + rnorm(n)
df <- data.frame(x=x1, y=y1, group="A")
x2 <- rnorm(n, mean=8)
y2 <- 0.7*x2 + 2 + rnorm(n)
df <- rbind(df, data.frame(x=x2, y=y2, group="B"))
x3 <- rnorm(n, mean=6)
y3 <- x3 - 5 - rnorm(n)
df <- rbind(df, data.frame(x=x3, y=y3, group="C"))
#calculating ellipses
library(ellipse)
df_ell <- data.frame()
for(g in levels(df$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y),
scale=c(sd(x),sd(y)),
centre=c(mean(x),mean(y))))),group=g))
}
#drawing
library(ggplot2)
p <- ggplot(data=df, aes(x=x, y=y,colour=group)) +
#geom_point(size=1.5, alpha=.6) +
geom_polygon(data=df_ell, aes(x=x, y=y,colour=group, fill=group), alpha=0.1, size=1, linetype=1)
### get center points of ellipses
library(dplyr)
ell_center <- df_ell %>% group_by(group) %>% summarise(x=mean(x), y=mean(y))
### animal images
library(rphylopic)
lion <- get_image("e2015ba3-4f7e-4950-9bde-005e8678d77b", size = "512")[[1]]
mouse <- get_image("6b2b98f6-f879-445f-9ac2-2c2563157025", size="512")[[1]]
bug <- get_image("136edfe2-2731-4acd-9a05-907262dd1311", size="512")[[1]]
### overlay images on center points
p + add_phylopic(lion, alpha=0.9, x=ell_center[[1,2]], y=ell_center[[1,3]], ysize=2, color="firebrick1") +
add_phylopic(mouse, alpha=1, x=ell_center[[2,2]], y=ell_center[[2,3]], ysize=2, color="darkgreen") +
add_phylopic(bug, alpha=0.9, x=ell_center[[3,2]], y=ell_center[[3,3]], ysize=2, color="mediumblue") +
theme_bw()
给出以下结果:
这没问题,但我真正想做的是将图像直接添加到 geom_polygon 的“填充”命令中。这可能吗 ?
最佳答案
我们无法为 ggplot 设置模式填充,但我们可以在 geom_tile
的帮助下做出一个非常简单的解决方法。复制您的初始数据:
#example data/ellipses
set.seed(101)
n <- 1000
x1 <- rnorm(n, mean=2)
y1 <- 1.75 + 0.4*x1 + rnorm(n)
df <- data.frame(x=x1, y=y1, group="A")
x2 <- rnorm(n, mean=8)
y2 <- 0.7*x2 + 2 + rnorm(n)
df <- rbind(df, data.frame(x=x2, y=y2, group="B"))
x3 <- rnorm(n, mean=6)
y3 <- x3 - 5 - rnorm(n)
df <- rbind(df, data.frame(x=x3, y=y3, group="C"))
#calculating ellipses
library(ellipse)
df_ell <- data.frame()
for(g in levels(df$group)){
df_ell <-
rbind(df_ell, cbind(as.data.frame(
with(df[df$group==g,], ellipse(cor(x, y), scale=c(sd(x),sd(y)),
centre=c(mean(x),mean(y))))),group=g))
}
我想展示的关键功能是将光栅图像转换为包含 X
、Y
、color 列的
因此我们稍后可以使用 data.frame
geom_tile
require("dplyr")
require("tidyr")
require("ggplot2")
require("png")
# getting sample pictures
download.file("http://content.mycutegraphics.com/graphics/alligator/alligator-reading-a-book.png", "alligator.png", mode = "wb")
download.file("http://content.mycutegraphics.com/graphics/animal/elephant-and-bird.png", "elephant.png", mode = "wb")
download.file("http://content.mycutegraphics.com/graphics/turtle/girl-turtle.png", "turtle.png", mode = "wb")
pic_allig <- readPNG("alligator.png")
pic_eleph <- readPNG("elephant.png")
pic_turtl <- readPNG("turtle.png")
# converting raster image to plottable data.frame
ggplot_rasterdf <- function(color_matrix, bottom = 0, top = 1, left = 0, right = 1) {
require("dplyr")
require("tidyr")
if (dim(color_matrix)[3] > 3) hasalpha <- T else hasalpha <- F
outMatrix <- matrix("#00000000", nrow = dim(color_matrix)[1], ncol = dim(color_matrix)[2])
for (i in 1:dim(color_matrix)[1])
for (j in 1:dim(color_matrix)[2])
outMatrix[i, j] <- rgb(color_matrix[i,j,1], color_matrix[i,j,2], color_matrix[i,j,3], ifelse(hasalpha, color_matrix[i,j,4], 1))
colnames(outMatrix) <- seq(1, ncol(outMatrix))
rownames(outMatrix) <- seq(1, nrow(outMatrix))
as.data.frame(outMatrix) %>% mutate(Y = nrow(outMatrix):1) %>% gather(X, color, -Y) %>%
mutate(X = left + as.integer(as.character(X))*(right-left)/ncol(outMatrix), Y = bottom + Y*(top-bottom)/nrow(outMatrix))
}
转换图像:
# preparing image data
pic_allig_dat <-
ggplot_rasterdf(pic_allig,
left = min(df_ell[df_ell$group == "A",]$x),
right = max(df_ell[df_ell$group == "A",]$x),
bottom = min(df_ell[df_ell$group == "A",]$y),
top = max(df_ell[df_ell$group == "A",]$y) )
pic_eleph_dat <-
ggplot_rasterdf(pic_eleph, left = min(df_ell[df_ell$group == "B",]$x),
right = max(df_ell[df_ell$group == "B",]$x),
bottom = min(df_ell[df_ell$group == "B",]$y),
top = max(df_ell[df_ell$group == "B",]$y) )
pic_turtl_dat <-
ggplot_rasterdf(pic_turtl, left = min(df_ell[df_ell$group == "C",]$x),
right = max(df_ell[df_ell$group == "C",]$x),
bottom = min(df_ell[df_ell$group == "C",]$y),
top = max(df_ell[df_ell$group == "C",]$y) )
据我所知,作者只想在椭圆内绘制图像,而不是原始的矩形形状。我们可以借助sp
包中的point.in.polygon
函数来实现它。
# filter image-data.frames keeping only rows inside ellipses
require("sp")
gr_A_df <-
pic_allig_dat[point.in.polygon(pic_allig_dat$X, pic_allig_dat$Y,
df_ell[df_ell$group == "A",]$x,
df_ell[df_ell$group == "A",]$y ) %>% as.logical,]
gr_B_df <-
pic_eleph_dat[point.in.polygon(pic_eleph_dat$X, pic_eleph_dat$Y,
df_ell[df_ell$group == "B",]$x,
df_ell[df_ell$group == "B",]$y ) %>% as.logical,]
gr_C_df <-
pic_turtl_dat[point.in.polygon(pic_turtl_dat$X, pic_turtl_dat$Y,
df_ell[df_ell$group == "C",]$x,
df_ell[df_ell$group == "C",]$y ) %>% as.logical,]
最后...
#drawing
p <- ggplot(data=df) +
geom_polygon(data=df_ell, aes(x=x, y=y,colour=group, fill=group), alpha=0.1, size=1, linetype=1)
p + geom_tile(data = gr_A_df, aes(x = X, y = Y), fill = gr_A_df$color) +
geom_tile(data = gr_B_df, aes(x = X, y = Y), fill = gr_B_df$color) +
geom_tile(data = gr_C_df, aes(x = X, y = Y), fill = gr_C_df$color) + theme_bw()
我们可以轻松调整绘图大小,而无需更改代码。
当然,您应该牢记您机器的性能,并且可能不要选择 20MP 图片在 ggplot
内绘图 =)
关于r - 将自定义图像添加到 geom_polygon 填充 ggplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28206611/
我引用了 this question 的答案并有其他问题。 我修改了如下代码: library(ggplot2) ids <- letters[1:2] # IDs and values to use
此代码生成一个包含 3 个多边形的图表... 我正在创建一个显示 3 个多边形的图表,如果有更好的方法来绘制多边形(实际上这些多边形代表事件并且这些事件有持续时间),我不是很感兴趣。 首先,我感兴趣的
更新: 我已经解决了我的问题。我在找 coord_cartesian(xlim = c(800, 2100), ylim = c(0, 0.0021)) 感谢所有试图提供帮助的人! 问题是: 我想很好
我需要创建一张欧洲 map 来显示某个变量在各个国家/地区的分布情况。我需要黑白 map 。我依靠 ggplot 并遵循了这个 approach举个例子。我根据 this blogpost 更改了图例
我正在尝试使用 geom_point 生成散点图其中点由平滑多边形外接,geom_polygon . 这是我的点数据: set.seed(1) df = x) return(data.fram
请在下面找到 My data nd。 nd 包含两列 > nd lnd y 1: 0.0 0.350 2: 0.1 0.351 3: 0.2 0.
您好,我需要一些帮助来绘制一个简单的三角形 library(ggplot2) library(data.table) dt.triangle <- data.table(group = c(1,1,1
我对 R 很陌生,最近一直在尝试使用以下代码在 ggplot2 中创建英国的轮廓: library(ggplot2) UK <- map_data("world2Hires", region = "U
我正在使用 R/ggplot 创建包含世界地震带的全局 map 。我正在使用来自此处的修改后的 shapefile:http://gmo.gfz-potsdam.de/ . 地 block 共有9层,
我正在绘制下表的美国多重耐药性趋势: MDR by region 使用以下代码: states_map<-map_data('state') m <- ggplot(ncftrendsort, aes
一位学生问我是否可以使用 R 重新创建类似于下面的图: 这是来自this paper.... 这类东西不是我的专长,但使用以下代码我能够创建 95% CI 椭圆并使用 geom_polygon() 绘
我正在尝试使用 ggplot2 在 Winkel Tripel 投影中绘制世界地图;它最终将在其之上有一些数据。据我所知,ggplot 本身不能做 Winkel Tripel,所以我已经用手动投影解决
我的数据集: Taxa dn dc Cha 10.2 -20.4 Cha 10.7 -19.7 Cha 4.9 -21.0 Cha 5.4 -20.6 Cha
有questions关于 ggplot2 的事实无法绘制具有 的多边形形状孔 . 这是因为,如果点的顺序不正确,则最终图看起来很糟糕,通常在 donut 形状内带有剪裁/修剪线。 我已经阅读了很多关于
我正在使用 geom_polygon 叠加数据,但无法区分颜色,因为它们合并在一起。如果层数更多,情况会更糟。 如何确保颜色不会混合? 示例数据 newdat <- structure(list(x
我正在尝试使用分面来生成多个填充不同值的 map 。 我创建了下面的简化示例,它重现了我想要做的事情以及我不期望从 ggplot 得到的结果。我使用美国 map 并为各州生成两个假设的社区。我可以单独
我有一个带有推文坐标的数据框,例如: library(ggplot2) df <- data.frame(long = c(-58.1, -58.2, -58.3, -58.4, -58.5, -55
说我有这些数据。一个用于对州的县进行着色,另一个用于绘制点。 library(tidyverse) library(gganimate) devtools::install_github("Urban
我正在使用 map 库和 ggplot 的 geom_polygon 创建 map 。我只是想将默认的蓝色、红色、紫色配色方案更改为其他颜色。我对 ggplot 非常陌生,所以如果我没有使用正确的数据
我正在遵循示例here为我的 ggplot 对象创建自定义工具提示。我不想使用plotly,因为它的渲染方式很 Shiny 。 我让它生成包含我想要的内容的工具提示,但它没有返回正确的近点。我注意到
我是一名优秀的程序员,十分优秀!