从ggplot2中的x轴删除空行

Remove blank lines from x axis in ggplot2

我在删除 x 轴值之间的 space 时遇到了一些麻烦。 我想消除每个 facet_wrap

中两个值之间的差距

我检查了这个post /ggplot-geom-tile-spacing-with-facets and this one remove-blank-lines-from-plot-geom-tile-ggplotscales=free_x 根本没有帮助。

这是我的一个可重现的例子

set.seed(123)
library(ggplot2)

x <-  rep(c(seq(2,40,length.out=8),seq(-2,-40,length.out=8)),times=1);
yy <- replicate(1,c(sort(10^runif(8,-9,1),decreasing=TRUE), sort(10^runif(8,-6,1),decreasing=TRUE),sort(10^runif(8,-3,0),decreasing=TRUE)))
direc <- rep(rep(c("A","B"),each=8),times=6)
add <-rep(seq(1:4),each=12)
df <- data.frame(x,yy,direc,add)

ggplot(data = df, aes(x = x, y = yy, colour=direc)) +
  geom_point(size=5)+
  geom_line(size=1.3)+
  scale_y_log10(limits = c(1e-7,1),breaks = c(3e-7,1e-3,1e-1,1))+
  scale_x_continuous(expand = c(0, 0),breaks=c(seq(-40,40,10)))+
  #scale_x_discrete(expand=c(0,0),drop=F)+
  #facet_grid(FIELD.Oe. ~ WER)+
  facet_wrap(~add)

我想消除 AB 因素之间的差距。我需要的是从 x 轴上删除未使用的值。

如果将 direc 转换为水平 c('B', 'A') 的因子(以在左侧排列 B 的面),

df$direc <- factor(direc, levels = c("B", "A"))

只需将 facet_wrap 替换为 facet_grid 即可。

ggplot(data = df, aes(x = x, y = yy, colour = direc)) +
  geom_point(size=5)+
  geom_line(size=1.3)+
  scale_y_log10(limits = c(1e-7,1),breaks = c(3e-7,1e-3,1e-1,1))+
  facet_grid(add ~ direc, scales = 'free')

嗯,一个技巧;希望这是你想要的:

colour 参数在技术上对于这种安排也是不必要的,尽管它不会导致任何问题。我也取出了 scale_x_continuous,因为它被 scales = 'free' 覆盖了。

我和@alistaire 有类似的想法,但无法让 ggplot 放弃足够的控制权,所以我选择了 cowplot::plot_grid()

我通过手动创建顺序重新排列了因素,B 出现在 A 之前。

df$facet_order <- factor(paste0(df$direc,df$add), levels=c("B1", "A1", "B2", "A2", "B3", "A3", "B4", "A4"))

分别为 AB 创建绘图,然后使用 plot_grid;

组合它们
g1 <- ggplot(data=df[df$direc=="B",], aes(x=x, y=yy)) +
  geom_point(size=5, col="red") +
  geom_line(size=1.3, col="red") +
  scale_y_log10(limits=c(1e-8,10), breaks = c(3e-7,1e-3,1e-1,1)) +
  scale_x_continuous(expand = c(0, 0),breaks=c(seq(-40,40,10))) +
  facet_wrap(~facet_order, ncol=1) +
  coord_cartesian(xlim=c(-50,0)) + theme(axis.line.x=element_line(colour="red", size=1.5),
                                         legend.position="none")
g2 <- ggplot(data=df[df$direc=="A",], aes(x=x, y=yy)) +
  geom_point(size=5, col="blue") +
  geom_line(size=1.3, col="blue") +
  scale_y_log10(limits=c(1e-8,10), breaks = c(3e-7,1e-3,1e-1,1)) +
  scale_x_continuous(expand = c(0, 0),breaks=c(seq(-40,40,10))) +
  facet_wrap(~facet_order, ncol=1) +
  coord_cartesian(xlim=c(0,50)) + theme(axis.text.y=element_blank(),
                                        axis.line.y=element_blank(),
                                        axis.ticks.y=element_blank(),
                                        axis.title.y=element_blank(), 
                                        axis.line.x=element_line(colour="blue", size=1.5),
                                        legend.position="none")
library(cowplot)
g <- plot_grid(g1,g2,scale=1.05)
g

根据您之后的输出大小,您可以将 size 参数弄乱 plot_grid 并使 x=0 标签完全重叠,以便数据完美对齐.

我的建议(在没有简单地不这样做的情况下)是对 add 的所有值执行此操作,这样您就可以手动移动相对的 x 轴,这样就没有任何间隙其中