[英]How can I control y-axis ticks and x-axis ticks independently in ggplot2?
[英]How do I change the colour of the background to the x axis ticks in ggplot2?
目前,我的圖表如下所示:
但是,我想為 x 軸刻度的背景着色,使其類似於:
我想我快到了,但不知道如何將背景更改為 x 軸刻度,而不是文字本身。
我使用以下方法更改了文本顏色: theme(axis.text.x = element_text(colour = Saltcolour))
任何幫助將不勝感激!
一種通用方法是使用 grobs ( rectGrob
object s ) 並使用rectGrob object顯示在軸文本下。 我將使用此處顯示的示例進行演示。
library(ggplot2)
set.seed(8675309)
df <- data.frame(
x=paste0('Test', 1:10),
y=rnorm(10, 10)
)
ggplot(df, aes(x,y)) +
geom_col(color='black', fill='gray', alpha=0.8) +
scale_y_continuous(expand=expansion(mult=c(0,0.05))) +
coord_cartesian(clip='off') +
labs(x=NULL) +
theme_classic()
要創建 grob,您可以使用grid
package 和rectGrob
。 由於我們要繪制許多框,我們可以為x
提供一個向量(在 x 位置 1 到 10 處繪制一個),然后通過發送給fill
的向量提供填充 colors。 請注意,使用 grobs 時,您可以通過gpar()
內部的gp
參數提供各種參數。 與 ggplot geom 不同,grobs 與數據框不匹配,因此您必須手動指定顏色/大小通過向量映射的方式,就像我在這里所做的那樣。
library(grid)
muh_grob <- grid::rectGrob(
x=1:10, y=0, gp=gpar(
color='black', fill=rainbow(10), alpha=0.2))
要使用 grob,您可以使用annotation_custom()
,您需要在其中指定 y 和 x 的最小值和最大值。 您可能必須弄亂數字才能使事情看起來正確。 請注意,這些值在 npc 中,所以 0 在左邊,1 在 x 軸的右邊(離散值)。 包含coord_*(clip="off")
也很重要。 它可以是任何coord_
函數,但你需要剪掉,否則你將看不到 grob。 我還在 x 軸文本的頂部應用了邊距,以將其向下移動一點,並為其周圍的框騰出空間。
ggplot(df, aes(x,y)) +
geom_col(color='black', fill='gray', alpha=0.8) +
scale_y_continuous(expand=expansion(mult=c(0,0.05))) +
coord_cartesian(clip='off') +
labs(x=NULL) +
theme_classic() +
theme(
axis.text.x = element_text(margin=margin(t=10)),
) +
annotation_custom(
grob=muh_grob, xmin = 0, xmax = 1, ymin = -0.5, ymax=0.1
)
OP 共享了一個 plot 具有兩個包含這些框的方面......那么怎么做呢? 好吧,這並不那么簡單,因為annotation_custom()
以相同的方式應用於每個 facet 。 每個 facet 共享相同的 x 和 y 值,因此如果您指定 grob 來自xmin=0
和xmax=0.5
,這會將您的 grob 應用到每個 facet的左側。
為了解決這個問題,對此處另一個答案中提供的方法進行了非常好的調整,如下所示:
library(gridExtra)
annotation_custom2 <-
function (grob, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, data)
{
layer(data = data, stat = StatIdentity, position = PositionIdentity,
geom = ggplot2:::GeomCustomAnn,
inherit.aes = TRUE, params = list(grob = grob,
xmin = xmin, xmax = xmax,
ymin = ymin, ymax = ymax))
}
然后,我將創建一個左右 grob,並使用 function 應用它,這允許我們為annotation_custom2()
指定一個data
參數並將 grob 放在一個方面。
muh_left_grob <- rectGrob(
x=1:5, y=0, gp=gpar(color='black', fill='red', alpha=seq(0.7, 0.1, length.out = 5)))
muh_right_grob <- rectGrob(
x=1:5, y=0, gp=gpar(color='black', fill='blue', alpha=seq(0.7, 0.1, length.out = 5)))
ggplot(df, aes(x,y)) +
geom_col(color='black', fill='gray', alpha=0.8) +
scale_y_continuous(expand=expansion(mult=c(0,0.05))) +
coord_cartesian(clip='off') +
labs(x=NULL) +
theme_classic() +
theme(axis.text.x = element_text(margin=margin(t=10))) +
facet_wrap(~my_facet, scales='free_x') +
annotation_custom2(
data=subset(df, my_facet=='A Facet'), grob=muh_left_grob,
xmin=0, xmax=1, ymin=-0.5, ymax=0.1) +
annotation_custom2(
data=subset(df, my_facet=='Another Facet'), grob=muh_right_grob,
xmin=0, xmax=1, ymin=-0.5, ymax=0.1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.