- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我和 this 有同样的问题用户 - 我有一个“锯齿状”分面图,其中底行的面板比其他行少,我希望每列底部都有 x 轴刻度。
该问题的建议解决方案是设置 scales="free_x"
. (在 ggplot 0.9.2.1 中;我相信我正在寻找的行为在早期版本中是默认的。)在我的情况下这是一个糟糕的解决方案:我的实际轴标签会很长,所以把它们放在每一行下面会占用太多房间。结果是这样的:
x <- gl(3, 1, 15, labels=paste("this is a very long axis label ", letters[1:5]))
y <- rnorm(length(x))
l <- gl(5, 3, 15)
d <- data.frame(x=x, y=y, l=l)
ggplot(d, aes(x=x, y=y)) + geom_point() + facet_wrap(~l, scales="free_x") +
theme(axis.text.x=element_text(angle=90, hjust=1))
grid
中手动完成但我不知道如何开始。
最佳答案
如果我没记错的话,有关于如何将所有标签添加到最后一列下的同一行以及如何将这些最后一个标签提升到下一行的问题。所以这里是两种情况的函数:
编辑:因为这就像 print.ggplot
的替代品(请参阅 getAnywhere(print.ggplot)
)我从中添加了一些行以保留功能。
编辑 2:我对其进行了更多改进:无需指定 nrow
和 ncol
再有,所有面板的图也可以打印。
library(grid)
# pos - where to add new labels
# newpage, vp - see ?print.ggplot
facetAdjust <- function(x, pos = c("up", "down"),
newpage = is.null(vp), vp = NULL)
{
# part of print.ggplot
ggplot2:::set_last_plot(x)
if(newpage)
grid.newpage()
pos <- match.arg(pos)
p <- ggplot_build(x)
gtable <- ggplot_gtable(p)
# finding dimensions
dims <- apply(p$panel$layout[2:3], 2, max)
nrow <- dims[1]
ncol <- dims[2]
# number of panels in the plot
panels <- sum(grepl("panel", names(gtable$grobs)))
space <- ncol * nrow
# missing panels
n <- space - panels
# checking whether modifications are needed
if(panels != space){
# indices of panels to fix
idx <- (space - ncol - n + 1):(space - ncol)
# copying x-axis of the last existing panel to the chosen panels
# in the row above
gtable$grobs[paste0("axis_b",idx)] <- list(gtable$grobs[[paste0("axis_b",panels)]])
if(pos == "down"){
# if pos == down then shifting labels down to the same level as
# the x-axis of last panel
rows <- grep(paste0("axis_b\\-[", idx[1], "-", idx[n], "]"),
gtable$layout$name)
lastAxis <- grep(paste0("axis_b\\-", panels), gtable$layout$name)
gtable$layout[rows, c("t","b")] <- gtable$layout[lastAxis, c("t")]
}
}
# again part of print.ggplot, plotting adjusted version
if(is.null(vp)){
grid.draw(gtable)
}
else{
if (is.character(vp))
seekViewport(vp)
else pushViewport(vp)
grid.draw(gtable)
upViewport()
}
invisible(p)
}
d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) +
xlim(0, 2) + stat_binhex(na.rm = TRUE) + theme(aspect.ratio = 1) +
facet_wrap(~ color)
facetAdjust(d)
facetAdjust(d, "down")
ggsave
时遇到一些问题连同
facetAdjust
.
ggplot
类的图需要,因为
ggsave
的源代码中有两部分:
print(plot)
和
default_name(plot)
如果没有手动提供文件名(根据
?ggsave
似乎它不应该工作,但)。因此,给定文件名,有一种解决方法(在某些情况下可能会产生副作用):
gtable
对象,但是我们使用
class(gtable) <- c("facetAdjust", "gtable", "ggplot")
.这样就允许使用
ggsave
和
print(plot)
按要求工作(见下文
print.facetAdjust
)
facetAdjust <- function(x, pos = c("up", "down"))
{
pos <- match.arg(pos)
p <- ggplot_build(x)
gtable <- ggplot_gtable(p); dev.off()
dims <- apply(p$panel$layout[2:3], 2, max)
nrow <- dims[1]
ncol <- dims[2]
panels <- sum(grepl("panel", names(gtable$grobs)))
space <- ncol * nrow
n <- space - panels
if(panels != space){
idx <- (space - ncol - n + 1):(space - ncol)
gtable$grobs[paste0("axis_b",idx)] <- list(gtable$grobs[[paste0("axis_b",panels)]])
if(pos == "down"){
rows <- grep(paste0("axis_b\\-[", idx[1], "-", idx[n], "]"),
gtable$layout$name)
lastAxis <- grep(paste0("axis_b\\-", panels), gtable$layout$name)
gtable$layout[rows, c("t","b")] <- gtable$layout[lastAxis, c("t")]
}
}
class(gtable) <- c("facetAdjust", "gtable", "ggplot"); gtable
}
ggplot2:::print.ggplot
仅有几行不同的打印功能:
print.facetAdjust <- function(x, newpage = is.null(vp), vp = NULL) {
if(newpage)
grid.newpage()
if(is.null(vp)){
grid.draw(x)
} else {
if (is.character(vp))
seekViewport(vp)
else pushViewport(vp)
grid.draw(x)
upViewport()
}
invisible(x)
}
d <- ggplot(diamonds, aes(carat, price, fill = ..density..)) +
xlim(0, 2) + stat_binhex(na.rm = TRUE) + theme(aspect.ratio = 1) +
facet_wrap(~ color)
p <- facetAdjust(d) # No output
print(p) # The same output as with the old version of facetAdjust()
ggsave("name.pdf", p) # Works, a filename is necessary
关于r - 在 facet_wrap 图中添加 "floating"轴标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163400/
有没有办法控制 facet_wrap() 图中单个图的大小/纵横比?谢谢, -D 最佳答案 是否可以简单地“释放”x 轴、y 轴或两者的解决方案scales与 scales = "free_x" ,
据我所知 facet_wrap按行填充。以同样的方式,您可以指定如何填充 matrix与 byrow我希望你可以用 facet_wrap 做同样的事情。我知道我可以重新排序一个因子的水平以这种方式绘制
我想生成一个facet_wrap,其中构面内因子的顺序是基于列因子顺序之一。问题的核心是每个组都有重复的因子水平,当我绘制时,facet_wrap 中仅正确排序了一个因子水平。 (见下图) 我尝试对每
简而言之:我想为使用 facet_wrap 制作的双面板图的每个“面板”设置单独的图例。使用 facet_wrap(scales="free") 在我想要不同的轴比例时效果很好,但不适用于点的大小。
如何让每个新行都以新的因子水平开始?目前它基于批处理和样本进行包装,但不会在新的批处理因子级别中断。尝试“facet_grid(~batch~sample)”时,有许多不需要的空面板。 R 的结果和
我正在尝试使用 facet_wrap 将标签(a、b、c...)添加到实际图的边缘之外的图。我希望将它们放在标签区域中,但与 facet_wrap 标签(这是数据组的名称)分开。我可以使用 coord
我正在尝试使用 facet_wrap 绘图,默认情况下按字母顺序排列绘图。但是,所需的结果是按数字降序排列。 下面是我得到的: library(tidyverse) M % ggplot(ae
我的目标是让图中所有国家之间的距离大致相等。例如,在第一类(增加)中,国家是分散的。另一方面,第二类和第三类国家之间的距离太近了。 这迫使我减小国家文本的大小(例如“IS”、“UK”...)和绘制的估
我正在使用 ggplot2 制作几个直方图和 facet_wrap并想在每个面板上绘制平均值。下面,我创建了一个虚拟数据框,找到每个方面的平均值,然后使用 geom_point 创建添加平均值的图。
我尝试根据与相应 facet_wrap 图中相同的数据,将直方图 suplots 添加到 facet_wrap 图的每个部分 geom_sf 图中。 我通过 Google 找到了一些方法,但到目前为止
在以下使用 facet_wrap , 双方 year和 model显示在绘图标签中。 library(tidyverse) mpg %>% filter(manufacturer=='audi')
我写了一个函数来绘制条形图。但是当我开始多面包装时,'~' 符号让事情变得困难。 rf.funct <- function(dat, predictor, feature){ ggplot(get
我有以下数据集: structure(list(Geschaeft = c(0.0961028525512254, 0.0753516756309475, 0, 0.0722803347280335,
假设我有这些数据: set.seed(100) mydf<- data.frame( day = rep(1:5, each=20), id = rep(LETTERS[1:4],25), x = r
我正在尝试在 ggplot 中创建图表使用 facet_wrap争论。 但是,我不想在每个小图上都有标签,我只想在图的顶部和左侧有一个标签。 例如在下图中,我想在顶部标签 SI2、SI1、WS2 和左
数据框 (借自 here): df.test <- data.frame(id = rep(1:6, each = 50), x = rnorm(50*6, mean = 10, sd = 5),
我的 ggplot 有以下代码 - facet_wrap 函数在页面上为每个 Name 绘制 20 个图,沿 x 轴有 5 个 Pcode。我想计算每个名称的平均 TE.Contr 并将该值绘制为每个
我试图实现的是让条形按每个面板的给定变量排序。 一个简单的例子: library(ggplot2) library(plyr) df <- data.frame(fac = c
我正在努力为 facet_wrap() 中的每个方面绘制渐变色标独立。 数据太大,无法在此处发布,但这是我的代码: ggplot(stack, aes(hour, day)) + geom_til
我正在尝试使用facet_wrap和ggplot2将多个标题添加到绘图中。说您例如拥有过去两年的季度数据,并且希望将季度数据与两个主要标题进行图形化比较; 2014年和2015年,以及相应季度的标题。
我是一名优秀的程序员,十分优秀!