我有一个函数来操作ggplot对象,通过将其转换为grob然后修改图层.我希望函数返回一个ggplot对象而不是grob.有没有一种简单的方法将grob转换回gg?
该文档上ggplotGrob
是非常稀疏.
简单的例子:
P <- ggplot(iris) + geom_bar(aes(x=Species, y=Petal.Width), stat="identity")
G <- ggplotGrob(P)
... some manipulation to G ...
## DESIRED:
P2 <- inverse_of_ggplotGrob(G)
such that, we can continue to use basic ggplot syntax, ie
`P2 + ylab ("The Width of the Petal")`
Run Code Online (Sandbox Code Playgroud)
更新:
要回答评论中的问题,这里的动机是根据每个方面中标签名称的值,以编程方式修改构面标签的颜色.以下功能很好地工作(基于前一个问题中的baptise输入).
我希望返回值colorByGroup
是一个ggplot对象,而不仅仅是一个grob.
这是代码,对于那些感兴趣的人
get_grob_strips <- function(G, strips=grep(pattern="strip.*", G$layout$name)) {
if (inherits(G, "gg"))
G <- ggplotGrob(G)
if (!inherits(G, "gtable"))
stop ("G must be a gtable object or a gg object")
strip.type <- …
Run Code Online (Sandbox Code Playgroud) 我试图用ggplot2重现以下[base R]图
我已经完成了大部分工作,但目前让我感到困惑的是将线段放置在图表右侧与相应标签相连的边缘地毯图上.标签已被绘制(在下面的第二个图中)anotation_custom()
并且我已经使用@ baptiste的关闭剪裁的技巧以允许绘制绘图边距.
尽管进行了许多尝试,但我无法将其放置segmentGrobs()
在设备中的所需位置,以便它们加入正确的地毯标签和标签.
一个可重复的例子是
y <- data.frame(matrix(runif(30*10), ncol = 10))
names(y) <- paste0("spp", 1:10)
treat <- gl(3, 10)
time <- factor(rep(1:10, 3))
require(vegan); require(grid); require(reshape2); require(ggplot2)
mod <- prc(y, treat, time)
Run Code Online (Sandbox Code Playgroud)
如果您没有安装素食主义者,我会dput
在问题的最后添加一个强化对象,并且fortify()
您希望运行该示例并fortify()
使用方便的绘图ggplot()
.我还包括一个有点冗长的函数,myPlt()
它说明了我到目前为止所做的工作,如果你已经加载了包并且可以创建,它可以用在示例数据集上mod
.
我已经尝试了很多选项但是我现在似乎正在黑暗中挣扎以正确放置线段.
我不是在寻找绘制示例数据集的标签/段的具体问题的解决方案,而是我可以用来以编程方式放置段和标签的通用解决方案,因为这将构成autoplot()
对象的方法的基础class(mod)
.我有标签制定好了,不是线段.那么问题:
xmin
,xmax
,ymin
,ymax
使用时,我希望把包含从数据坐标运行线路段GROB参数x0
,y0
来x1
,y1
?annotation_custom()
绘制段 …在具有多个构面变量的图中,ggplot2重复"外部"变量的构面标签,而不是在"内部"变量的所有级别上具有单个跨越构面条带.我有一直在使用,以覆盖与使用单个跨越小面条重复外端面标签一些代码gtable_add_grob
从gtable
包.
不幸的是,由于facet strip的grob结构发生了变化,此代码不再适用于ggplot2 2.2.0.具体来说,在ggplot2的早期版本中,facet标签的每一行都有自己的一组grob.但是,在版本2.2.0中,看起来每个facet标签的垂直堆栈都是单个grob.这打破了我的代码,我不知道如何解决它.
这是一个具体的例子,取自几个月前我回答的SO问题:
# Data
df = structure(list(location = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L), .Label = c("SF", "SS"), class = "factor"), species = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, …
Run Code Online (Sandbox Code Playgroud) 令我有些惊讶的是,这从未引起我的注意(我想直到今天我才用圆线末端画了很多东西)。
当绘制带有圆线末端的线段时,这“当然”是作为附加的 grob 元素添加的,但它通过超出给定值来向图形表示添加“值”。我怎样才能改变这个?
我认为需要重新计算原始值,以便在添加圆端时达到正确的值,但这需要在绘制时(即在 grob 函数内)进行此计算。我对杂种很不擅长。如有帮助,将不胜感激。
library(ggplot2)
df <- data.frame(x = 0, xend = 1, y = 0, yend = 0)
ggplot(df, aes(x, y)) +
geom_vline(xintercept = c(0, 1), lty = 2) +
geom_segment(aes(xend = xend, yend = yend),
linewidth = 6, alpha = .5,
lineend = "round") +
labs(title = "NOT an accurate representation of the data",
caption = "The line extends beyond the given values")
Run Code Online (Sandbox Code Playgroud)
创建于 2023 年 11 月 16 日,使用reprex v2.0.2
b <- ggplot(cars,aes(x=speed,y=dist))+geom_line()
grid.arrange(
b,
plot(cars),
ncol=1
)
Run Code Online (Sandbox Code Playgroud)
给我以下错误
gList中的错误(列表(grobs = list(list(x = 0.5,y = 0.5,width = 1,height = 1,:"gList"中只允许'grobs')
让我们假设我的第二个图必须从plot
函数中出来.如何将该输出转换为类似grob
对象,以便它可以很好地运行grid.arrange
?
如何在ggplot中获取 geom_point的x , y坐标,其中参考系是整个绘制的图像?
我可以使用一些geom_point s创建一个ggplot:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Run Code Online (Sandbox Code Playgroud)
这给出:
通过将其转换为grob,我可以提取有关此ggplot 的一些附加信息,例如相对于绘图面板的坐标,由紫色箭头标记。但是,这忽略了轴占用的空间。
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
Run Code Online (Sandbox Code Playgroud)
当我从整个图像的左下角开始测量时,如何获得x , y坐标的值,用绿色箭头标记?
如果有可能,我想解决顾及主题的的ggplot。添加主题like+ theme_void()
会影响轴,并且还会相对于整个绘制图像移动点的位置。
更新:我意识到轴的字体大小会根据绘图的宽度和高度而变化,从而影响绘图面板的相对大小。因此,在不定义绘图宽度和绘图高度的情况下以npc …
我有一个构成n x m
网格的刻面图.按照设计,最后一个(右下角)单元格总是空的,所以我想通过添加另一个ggplot对象来利用额外的空间.我目前的解决方案依赖于低级viewport
方法,这种方法不是很优雅,需要对位置和大小进行一些硬编码.
相反,我认为空的空间可以通过其他方式到达,可能与gridExtra
?
这是一个最小的例子n=m=2
.请注意,边缘未正确对齐,因此需要一些额外的工作来手动调整视口的参数,这是一种痛苦,特别是如果(n, m)
之后进行更改.
library(ggplot2)
library(grid)
p <- qplot(displ, hwy, data = mpg[mpg$cyl != 5, ]) +
facet_wrap(~ cyl, nrow=2)
q <- qplot(date, unemploy, data = economics, geom = "line") +
labs(x = NULL, y = NULL)
p
print(q, vp=viewport(0.75, 0.275, 0.45, 0.45))
Run Code Online (Sandbox Code Playgroud)
有没有办法保持在地图边界内的地图上抖动的点?在下面的示例中,康涅狄格州西南部的抖动位置最终出现在水中或相邻的状态中,是否有办法让R抖动位置点而不是地图边界?
或者,是否有其他一些技术,例如在每个城市附近创建一个表格,以列出公司的名称?
# create a data frame called "ct" of geolocations in two cities near the border of a US state (Connecticut). Each firm has the same lat and longitude of one of the two cities
> dput(ct)
structure(list(city = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L), .Label = c("Greenwich", "Stamford"), class = "factor"),
firm = structure(c(1L, 12L, 21L, 22L, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将剪贴蒙版应用于ggplot中的geom以遮盖部分数据,但保持轴,网格,其他geom和图例可见.我不想创建一个特定的情节,因此我不是在寻找一个处理阴影的某些部分的多边形.
这是我想要模仿的设计(面具,不一定是主题,我现在该怎么做):
(来源)
另请参见此示例
有人可能会争辩说我可以过滤未定义掩码的多边形中包含的数据.但是,虽然它适用于点,并且可以用于多边形/线状对象,但它适用于栅格(边框不会完全遵循非垂直或非水平线).所以我尝试了以下方法:
library(ggplot2)
library(gridSVG)
library(grImport)
# Create a plot
p <- ggplot(diamonds[1:300,], aes(carat, price)) + geom_point(aes(colour = cut))
# And a clipping mask
pg <- polygonGrob(c(.7, 0, 0, 1, 1),
c(0, .7, 1, 1, 0))
cp <- clipPath(pg)
Run Code Online (Sandbox Code Playgroud)
我能够使用包gridSVG
定义剪贴蒙版,但我必须将它ggplot对象上的困难,甚至提取GROB后(见资源在这里)有ggplotGrob()
.我无法将剪贴蒙版应用于grob:
g <- ggplotGrob(p) # store the plot as a grob
registerClipPath("mask", cp)
g_clipped <- clipPath(g)
gridsvg(name = "test_c2.svg")
grid.draw(clipPathGrob(g_clipped, cp)$grob)
dev.off()
Run Code Online (Sandbox Code Playgroud)
我的直觉是g_clipped
应该绘制,但我不能grid.draw()
,因为它是一个clipPath对象.grid.draw() …
这是我之前的问题的后续问题,我正在寻找一种解决方案,先绘制轴,然后绘制数据。答案适用于该特定问题和示例,但它提出了一个更一般的问题,即如何更改底层 grobs 的绘图顺序。首先是轴,然后是数据。
非常类似于面板网格 grob 可以绘制在顶部或不绘制的方式。
面板网格和轴格布显然是不同的——轴更多地作为引导对象而不是“简单”格布。(轴是用 绘制的ggplot2:::draw_axis()
,而面板网格是作为ggplot2:::Layout
对象的一部分构建的)。
我想这就是为什么在顶部绘制轴的原因,我想知道是否可以更改绘制顺序。
# An example to play with
library(ggplot2)
df <- data.frame(var = "", val = 0)
ggplot(df) +
geom_point(aes(val, var), color = "red", size = 10) +
scale_x_continuous(
expand = c(0, 0),
limits = c(0,1)
) +
coord_cartesian(clip = "off") +
theme_classic()
Run Code Online (Sandbox Code Playgroud)
PS我不会接受甚至不赞成创建假轴的答案,因为这不是我正在寻找或试图理解的。