簡體   English   中英

如何將背景顏色更改為 ggplot2 中的 x 軸刻度?

[英]How do I change the colour of the background to the x axis ticks in ggplot2?

目前,我的圖表如下所示:

沒有 x 軸刻度背景的圖

但是,我想為 x 軸刻度的背景着色,使其類似於:

帶有 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=0xmax=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM