- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 R 中的 ggplot 为 DC 创建 GIS map 。我正在尝试自定义我的图例栏和标签。我可以使用 gtable_filter 移动图例键,但不能移动标签。我想像其他标签一样将最后一个标签“1”移到它的图例栏附近。任何帮助表示赞赏。 Image of the map
我正在使用以下 R 代码:
Data set looks like below
head(d1930)
R Output:
Simple feature collection with 6 features and 355 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: -77.0823 ymin: 38.89061 xmax: -77.0446 ymax: 38.94211
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
fipsstate fipscounty tract NHGISST NHGISCTY GISJOIN GISJOIN2 SHAPE_AREA SHAPE_LEN X GISJOIN.x.1 year cenv1_1 cenv8_1
1 11 001 000001 110 0010 G11000100001 11000100001 1953567 8965.853 1 G11001000001 1930 7889 5885
2 11 001 000002 110 0010 G11000100002 11000100002 1345844 5668.739 10 G11001000002 1930 6250 5164
# # borrowed map theme and code from here
# # https://timogrossenbacher.ch/2016/12/beautiful-thematic-maps-with-ggplot2-only/
theme_map <- function(...) {
theme_minimal() +
theme(
text = element_text(family = "Ubuntu Regular", color = "#22211d"),
axis.line = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
# panel.grid.minor = element_line(color = "#ebebe5", size = 0.2),
panel.grid.major = element_line(color = "white", size = 0.2),
panel.grid.minor = element_blank(),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA),
legend.background = element_rect(fill = "white", color = NA),
panel.border = element_blank(),
...
)
}
# create the color vector
my.cols <- brewer.pal(4, "Blues")
# compute labels
labels <- c()
# put manual breaks as desired
brks <- c(0,0.15,0.5,0.85,1)
# round the labels (actually, only the extremes)
for(idx in 1:length(brks)){
labels <- c(labels,round(brks[idx + 1], 2))
}
# put labels into label vector
labels <- labels[1:length(labels)-1]
# define a new variable on the data set just as above
d1930$brks <- cut(d1930$pAA,
breaks = brks,
include.lowest = TRUE,
labels = labels)
# define breaks scale and labels scales
brks_scale <- levels(d1930$brks)
labels_scale <- rev(brks_scale)
# draw the plot with legend at the bottom
p <- ggplot(d1930) +
geom_sf(aes(fill=brks),colour = "white")+
coord_sf() +
theme_map() +
theme(legend.position = "bottom",legend.background = element_rect(color = NA))
# provide manual scale and colors to the graph
tester <- p +
# now we have to use a manual scale,
# because only ever one number should be shown per label
scale_fill_manual(
# in manual scales, one has to define colors, well, we have done it earlier
values = my.cols,
breaks = rev(brks_scale),
name = "Share of Population African American",
drop = FALSE,
labels = labels_scale,
guide = guide_legend(
direction = "horizontal",
keyheight = unit(2.5, units = "mm"),
keywidth = unit(85 / length(labels), units = "mm"), title.position = 'top',
# shift the labels around, the should be placed
# exactly at the right end of each legend key
title.hjust = 0.5,
label.hjust = 1, ### change here
nrow = 1,
byrow = T,
# also the guide needs to be reversed
reverse = T,
label.position = "bottom"
)
)
tester
library(grid)
library(gtable)
extendLegendWithExtremes <- function(p){
p_grob <- ggplotGrob(p)
legend <- gtable_filter(p_grob, "guide-box")
legend_grobs <- legend$grobs[[1]]$grobs[[1]]
print(legend_grobs)
# grab the first key of legend
legend_first_key <- gtable_filter(legend_grobs, "key-3-1-1")
legend_first_key$widths <- unit(2, units = "cm")
# modify its width and x properties to make it longer
legend_first_key$grobs[[1]]$width <- unit(1, units = "cm")
legend_first_key$grobs[[1]]$x <- unit(1.6, units = "cm")
# last key of legend
legend_last_key <- gtable_filter(legend_grobs, "key-3-4-1")
legend_last_key$widths <- unit(2, units = "cm")
# analogous
legend_last_key$grobs[[1]]$width <- unit(1, units = "cm")
legend_last_key$grobs[[1]]$x <- unit(0.5, units = "cm")
# grab the last label so we can also shift its position
# below code is where i am stuck as this is not shifting the label
legend_last_label <- gtable_filter(legend_grobs, "label-5-4")
legend_last_label$widths <- unit(20, units = "cm")
legend_last_label$grobs[[1]]$x <- unit(-10.1, units = "cm")
legend_last_label$grobs[[1]]$width <- unit(10, units = "cm")
# Insert new color legend back into the combined legend
legend_grobs$grobs[legend_grobs$layout$name == "key-3-1-1"][[1]] <-
legend_first_key$grobs[[1]]
legend_grobs$grobs[legend_grobs$layout$name == "key-3-4-1"][[1]] <-
legend_last_key$grobs[[1]]
legend_grobs$grobs[legend_grobs$layout$name == "label-5-4"][[1]] <-
legend_last_label$grobs[[1]]
legend$grobs[[1]]$grobs[1][[1]] <- legend_grobs
p_grob$grobs[p_grob$layout$name == "guide-box"][[1]] <- legend
# the plot is now drawn using this grid function
grid.newpage()
grid.draw(p_grob)
print(legend_grobs)
# save the plot
ggsave(paste0("~/Desktop/RA/",dateo,"_dc_1930.jpg"),
plot = p_grob, dpi = 300, width = 11, height = 8.5, units = c("in"))
}
extendLegendWithExtremes(tester)
最佳答案
可能是您没有准确捕捉到最后一个标签的坐标?例如 legend_last_label$grobs[[1]]$x
是 NULL
它应该返回 1npc
.以下是您如何获得它的方法:
legend_last_label$grobs[[1]][["children"]][[1]][["children"]][[1]][["x"]]
#> [1] 1npc
# Overwrite it as you wish:
legend_last_label$grobs[[1]][["children"]][[1]][["children"]][[1]][["x"]] <- unit(-1, units = "cm")
gPath
更安全每个 grob 的 s 以“捕获”它们,然后使用
editGrob
编辑它们功能。这是应用于您的情节的示例
tester
:
g <- grid.force(ggplotGrob(tester)) # get all grobs and their components
grid.ls(g) # list the names of all grobs
#> guide-box.11-5-11-5
#> legend.box.background.2-4-4-2
#> guides.3-3-3-3
#> background.1-7-7-1
#> title.2-6-2-2
#> guide.title.titleGrob.123
#> GRID.text.121
#> key-3-1-bg.4-2-4-2
#> key-3-1-1.4-2-4-2
#> key-3-2-bg.4-3-4-3
#> key-3-2-1.4-3-4-3
#> key-3-3-bg.4-4-4-4
#> key-3-3-1.4-4-4-4
#> key-3-4-bg.4-5-4-5
#> key-3-4-1.4-5-4-5
#> label-5-1.6-2-6-2
#> guide.label.titleGrob.126
#> GRID.text.124
#> label-5-2.6-3-6-3
#> guide.label.titleGrob.129
#> GRID.text.127
#> label-5-3.6-4-6-4
#> guide.label.titleGrob.132
#> GRID.text.130
#> label-5-4.6-5-6-5
#> guide.label.titleGrob.135
#> GRID.text.133
#> label-5-4.6-5-6-5
#> guide.label.titleGrob.135
#> GRID.text.133
gPath
s 对于每个 grob。也许有更简单的方法,但这是一种方法:
# delete "layout::" from raw gPath & add grob name at the end
gpaths <- paste(gsub(pattern = "layout::",
replacement = "",
x = grid.ls(g, print = FALSE)$gPath),
grid.ls(g, print = FALSE)$name,
sep = "::")
gpaths[grepl("guide-box.*label-5-4.*GRID\\.text.*", gpaths)]
#> [1] "guide-box.11-5-11-5::guides.3-3-3-3::label-5-4.6-5-6-5::guide.label.titleGrob.135::GRID.text.133"
g <- editGrob(grob = g,
gPath = gpaths[grepl("guide-box.*label-5-4.*GRID.text.*", gpaths)],
x = unit(-1, "cm"))
plot(g)
g <- editGrob(grob = g,
gPath = gpaths[grepl("guide-box.*key-3-4-1.*", gpaths)],
x = unit(0.5, "cm"),
width = unit(1, "cm"))
plot(g)
labels <- labels[1:length(labels)-1]
与
labels <- labels[-length(labels)]
;否则我会收到来自
cut
的错误消息函数,当你构建时
d1930$brks
关于r - 使用 gtable/grob 在 ggplot 中自定义标签元素位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435521/
我正在从 Stata 迁移到 R(plm 包),以便进行面板模型计量经济学。在 Stata 中,面板模型(例如随机效应)通常报告组内、组间和整体 R 平方。 I have found plm 随机效应
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我想要求用户输入整数值列表。用户可以输入单个值或一组多个值,如 1 2 3(spcae 或逗号分隔)然后使用输入的数据进行进一步计算。 我正在使用下面的代码 EXP <- as.integer(rea
当 R 使用分类变量执行回归时,它实际上是虚拟编码。也就是说,省略了一个级别作为基础或引用,并且回归公式包括所有其他级别的虚拟变量。但是,R 选择了哪一个作为引用,以及我如何影响这个选择? 具有四个级
这个问题基本上是我之前问过的问题的延伸:How to only print (adjusted) R-squared of regression model? 我想建立一个线性回归模型来预测具有 15
我在一台安装了多个软件包的 Linux 计算机上安装了 R。现在我正在另一台 Linux 计算机上设置 R。从他们的存储库安装 R 很容易,但我将不得不使用 安装许多包 install.package
我正在阅读 Hadley 的高级 R 编程,当它讨论字符的内存大小时,它说: R has a global string pool. This means that each unique strin
我们可以将 Shiny 代码写在两个单独的文件中,"ui.R"和 "server.R" , 或者我们可以将两个模块写入一个文件 "app.R"并调用函数shinyApp() 这两种方法中的任何一种在性
我正在使用 R 通过 RGP 包进行遗传编程。环境创造了解决问题的功能。我想将这些函数保存在它们自己的 .R 源文件中。我这辈子都想不通怎么办。我尝试过的一种方法是: bf_str = print(b
假设我创建了一个函数“function.r”,在编辑该函数后我必须通过 source('function.r') 重新加载到我的全局环境中。无论如何,每次我进行编辑时,我是否可以避免将其重新加载到我的
例如,test.R 是一个单行文件: $ cat test.R # print('Hello, world!') 我们可以通过Rscript test.R 或R CMD BATCH test.R 来
我知道我可以使用 Rmd 来构建包插图,但想知道是否可以更具体地使用 R Notebooks 来制作包插图。如果是这样,我需要将 R Notebooks 编写为包小插图有什么不同吗?我正在使用最新版本
我正在考虑使用 R 包的共享库进行 R 的站点安装。 多台计算机将访问该库,以便每个人共享相同的设置。 问题是我注意到有时您无法更新包,因为另一个 R 实例正在锁定库。我不能要求每个人都关闭它的 R
我知道如何从命令行启动 R 并执行表达式(例如, R -e 'print("hello")' )或从文件中获取输入(例如, R -f filename.r )。但是,在这两种情况下,R 都会运行文件中
我正在尝试使我当前的项目可重现,因此我正在创建一个主文档(最终是一个 .rmd 文件),用于调用和执行其他几个文档。这样我自己和其他调查员只需要打开和运行一个文件。 当前设置分为三层:主文件、2 个读
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
我的 R 包中有以下描述文件 Package: blah Title: What the Package Does (one line, title case) Version: 0.0.0.9000
有没有办法更有效地编写以下语句?accel 是一个数据框。 accel[[2]]<- accel[[2]]-weighted.mean(accel[[2]]) accel[[3]]<- accel[[
例如,在尝试安装 R 包时 curl作为 usethis 的依赖项: * installing *source* package ‘curl’ ... ** package ‘curl’ succes
我想将一些软件作为一个包共享,但我的一些脚本似乎并不能很自然地作为函数运行。例如,考虑以下代码块,其中“raw.df”是一个包含离散和连续类型变量的数据框。函数“count.unique”和“squa
我是一名优秀的程序员,十分优秀!