gpt4 book ai didi

r - geom_bar() + 象形图,怎么做?

转载 作者:行者123 更新时间:2023-12-02 19:14:42 25 4
gpt4 key购买 nike

(有关更新,请参阅帖子底部)

初始帖子,2014-07-29 11:43:38Z

我在 the Economist's website 上看到了这个图形想知道是否可以生成一个嵌入这种说明性图标的 geom_bar() ? (下面是虚拟数据)

enter image description here

虚拟数据,

require(ggplot2)

# Generate data
df3 <- data.frame(units = c(1.3, 1.8, 2.7, 4.2, 4.7, 6.7, 20),
what = c('Wikipedia', 'London Olympic Park', 'Aircraft carrier',
'The Great Pyramid', 'Stonehenge', 'Burj Khalifas',
'Empire State Building'))

# make gs an ordered factor
df3$what <- factor(df3$what, levels = df3$what, ordered = TRUE)

#plots
ggplot(df3, aes(what, units)) + geom_bar(fill="white", colour="darkgreen",
alpha=0.5, stat="identity") + coord_flip() + scale_x_discrete() +
scale_y_continuous(breaks=seq(0, 20, 2)) + theme_bw() +
theme(axis.title.x = element_blank(), axis.title.y = element_blank())

enter image description here

更新 #1,2014-07-29 15:07:51Z

显然Robert Grant已开始构建 R 函数来生成带有象形图的条形图,it can be found at Github 。感谢Andrie以获得该信息。我目前正在研究 Robert 的函数是否可以实现我想要的功能。

如果您对如何使用 Robert's function 回答我的问题有任何建议,请留言。 .

更新#2,2014-08-02 12:35:19Z

这里是 Grant's R-pictogram-function work 的简单说明

# in case you don't alredy have RCurl
# install.packages("RCurl", dependencies = TRUE)
source_github <- function(u) {
# load package
require(RCurl)

# read script lines from website and evaluate
script <- getURL(u, ssl.verifypeer = FALSE)
eval(parse(text = script),envir=.GlobalEnv)
}

得到这个脚本form this SO answer

source_github("https://raw.githubusercontent.com/robertgrant/pictogram/master/pictogram.R")

# install.packages("png", dependencies = TRUE)
require(png)

img <- readPNG(system.file("img", "Rlogo.png", package="png"))
pictogram(icon = img, n = c( 12, 35, 7),
grouplabels=c("12 R logos","35 R logos","7 R logos"))

这给了你这样的情节 R logos

最佳答案

这是我根据 this idea 得出的结论。 R logo摘自维基百科。

library(png)
fill_images <- function()
{
l <- list()
for (i in 1:nrow(df3))
{
for (j in 1:floor(df3$units[i]))
{
#seems redundant, but does not work if moved outside of the loop (why?)
img <- readPNG("~/../Rlogo.png")
g <- rasterGrob(img, interpolate=TRUE)
l <- c(l, annotation_custom(g, xmin = i-1/2, xmax = i+1/2, ymin = j-1, ymax = j))
}
}
l
}

p <- ggplot(df3, aes(what, units)) +
geom_bar(fill="white", colour="darkgreen", alpha=0.5, stat="identity") +
coord_flip() +
scale_y_continuous(breaks=seq(0, 20, 2)) +
scale_x_discrete() +
theme_bw() +
theme(axis.title.x = element_blank(), axis.title.y = element_blank()) +
fill_images()
p

enter image description here

我不太确定绘制部分图像的最佳方法是什么。

更新:

事实上,这比我想象的要容易。我通过在图像的一部分上绘制白色矩形来剪辑图像。请注意,geom_bar 应位于顶部,以便剪切矩形不会影响它。网格线存在一个小问题(它们部分被这些白色矩形隐藏),所以我必须对它们的位置进行硬编码并手动恢复它们。当然,这不是一个理想的解决方案,但我不知道如何以编程方式检索网格位置。不管怎样,最终的情节完成了任务,而且看起来也很漂亮!

library(png)
fill_images <- function()
{
l <- list()
for (i in 1:nrow(df3))
{
for (j in 1:ceiling(df3$units[i]))
{
img <- readPNG("~/../Rlogo.png")
g <- rasterGrob(img, interpolate=TRUE)
l <- c(l, annotation_custom(g, xmin = i-1/2, xmax = i+1/2, ymin = j-1, ymax = j))
}
}
l
}

clip_images <- function(restore_grid = TRUE)
{
l <- list()
for (i in 1:nrow(df3))
{
l <- c(l, geom_rect(xmin = i-1/2, xmax = i+1/2,
ymin = df3$units[i], ymax = ceiling(df3$units[i]),
colour = "white", fill = "white"))
if (restore_grid && ceiling(df3$units[i]) %in% major_grid)
l <- c(l, geom_segment(x = i-1, xend = i+1,
y = ceiling(df3$units[i]),
yend = ceiling(df3$units[i]),
colour = grid_col, size = grid_size))
}
l
}

grid_col <- "grey50"
grid_size <- 0.6
major_grid <- 0:10 * 2
p <- ggplot(df3, aes(what, units)) +
fill_images() +
clip_images() +
geom_bar(fill=NA, colour="darkgreen", size=1.2, alpha=0.5, stat="identity") +
coord_flip() +
scale_y_continuous(breaks=seq(0, 20, 2)) +
scale_x_discrete() +
theme_bw() +
theme(axis.title.x = element_blank(), axis.title.y = element_blank(),
panel.grid.major.x = element_line(colour = grid_col, size = grid_size),
panel.grid.major.y = element_line(colour = NA))
p

enter image description here

为了保存 .svg 文件,请使用例如

ggsave(file="test.svg", plot=p, width=10, height=8)

如果您想要将填充图像作为 .svg 文件,请查看 grImport package 。看来您必须手动将 .svg 转换为 .ps(例如使用 imagemagick),然后按照指南进行操作。

关于r - geom_bar() + 象形图,怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25014492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com