[英]R ggplot2 - Add ticks on top and right sides of all facets
I am using ggplot2
to create the following plot: 我正在使用
ggplot2
创建以下图:
library(ggplot2)
df <- data.frame(site=rep(c("CA-Oas","US-Oho","CA-Obs","CA-TP1"), each=124),
exper=rep(c("bberry","medlyn"), each=62, 4),
sm=runif(496, min=0, max=100),
lh=runif(496, min=0, max=400),
month=rep(c("Jul","Aug"), each=31, 8))
ggplot(df, aes(x=sm, y=lh, colour=exper, shape=month)) +
geom_point(size=2.5, alpha=0.9) +
facet_wrap(~site, nrow=2) +
theme_bw(base_size=18) +
ylab(bquote('Latent heat ('*W~m^-2*')')) +
xlab(bquote('Soil water content (%)')) +
scale_color_manual(values=c("bberry"="tomato2", "medlyn"="dodgerblue"),
labels=c("bberry"="Ball-Berry", "medlyn"="Medlyn")) +
theme(panel.grid.minor=element_blank(),
panel.grid.major=element_blank(),
legend.title=element_blank(),
legend.box="horizontal",
legend.position=c(0.4, 0.6),
legend.spacing = unit(-0.2,"cm"))
However, the journal I am writing a manuscript to requires all plots with ticks on both axis (top/bottom and left/right). 但是,我正在写手稿的期刊要求所有绘图都在两个轴上都带有刻度(顶部/底部和左侧/右侧)。 I am struggling to achieve that on
ggplot2
. 我正在努力在
ggplot2
上实现这一ggplot2
。
Basically, what I need is to: 基本上,我需要做的是:
This is roughly what I need to achieve (notice the axis ticks and labels): 这大致就是我需要实现的(注意轴刻度和标签):
Any hints on how to get there? 关于如何到达那里的任何提示?
facet_rep_wrap
from the lemon package is perfect for this, as it preserves axis lines (& optionally labels) in all facets. facet_rep_wrap
从柠檬包是完美的这一点,因为它保留在所有方面轴线(任选标签)。
See inline comments below for other tweaks to the code: 有关代码的其他调整,请参见以下内联注释:
library(lemon)
ggplot(df, aes(x=sm, y=lh, colour=exper, shape=month)) +
geom_point(size=2.5, alpha=0.9) +
facet_rep_wrap(~site, nrow = 2) + # instead of facet_wrap
theme_bw(base_size=18) +
ylab(bquote('Latent heat ('*W~m^-2*')')) +
xlab(bquote('Soil water content (%)')) +
scale_x_continuous(sec.axis = dup_axis()) + # add duplicated secondary axis to get
scale_y_continuous(sec.axis = dup_axis()) + # axes on top / right sides
scale_color_manual(values=c("bberry"="tomato2", "medlyn"="dodgerblue"),
labels=c("bberry"="Ball-Berry", "medlyn"="Medlyn")) +
theme(panel.grid.minor=element_blank(),
panel.grid.major=element_blank(),
legend.title=element_blank(),
legend.box="horizontal",
legend.position=c(0.4, 0.6),
legend.spacing = unit(-0.2,"cm"),
strip.placement = "outside", # place facet strips outside axis
axis.ticks.length = unit(-2.75, "pt"), # point axis ticks inwards (2.75pt is
# the default axis tick length here)
axis.text.x.top = element_blank(), # do not show top / right axis labels
axis.text.y.right = element_blank(), # for secondary axis
axis.title.x.top = element_blank(), # as above, don't show axis titles for
axis.title.y.right = element_blank()) # secondary axis either
(Note: It's possible to achieve the same result with just ggplot2 & some grob hacking, but that approach is rather more complicated, so I wouldn't go there unless installing new packages is really cumbersome in a computing environment...) (注意:仅通过ggplot2和一些grob hack就有可能达到相同的结果,但是这种方法相当复杂,因此除非在计算环境中安装新软件包确实很麻烦,否则我不会去那里。)
(This gets ticks along the top and right edges, but not for all facets. And adding scales = "free"
to the facet_wrap call will add ticks for all facets, but it also adds labels to all of them, which is redundant.) (这会沿顶部和右侧边缘获得刻度线,但不是针对所有构面。在facet_wrap调用中添加
scales = "free"
将为所有构面添加刻度线,但同时为所有构面添加标签,这是多余的。)
ggplot(df, aes(x=sm, y=lh, colour=exper, shape=month)) +
geom_point(size=2.5, alpha=0.9) +
facet_wrap(~site, nrow=2) +
theme_bw(base_size=18) +
ylab(bquote('Latent heat ('*W~m^-2*')')) +
xlab(bquote('Soil water content (%)')) +
scale_color_manual(values=c("bberry"="tomato2", "medlyn"="dodgerblue"),
labels=c("bberry"="Ball-Berry", "medlyn"="Medlyn")) +
scale_x_continuous(sec.axis = dup_axis(labels = NULL)) + # NEW
scale_y_continuous(sec.axis = dup_axis(labels = NULL)) + # NEW
theme(panel.grid.minor=element_blank(),
panel.grid.major=element_blank(),
strip.placement = "outside", # NEW
legend.title=element_blank(),
legend.box="horizontal",
legend.position=c(0.4, 0.6),
legend.spacing = unit(-0.2,"cm"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.