當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R ggplot2 theme 修改主題的組件


主題是自定義繪圖的非數據組件的強大方法:即標題、標簽、字體、背景、網格線和圖例。主題可用於為繪圖提供一致的定製外觀。使用 theme() 修改單個圖的主題;如果您想修改活動主題以影響所有後續繪圖,請參閱theme_update()。如果您想使用完整的主題,例如 theme_bw()theme_minimal() 等,請使用 complete themes 中提供的主題。主題元素根據繼承一起記錄,請閱讀下麵有關主題繼承的更多信息。

用法

theme(
  line,
  rect,
  text,
  title,
  aspect.ratio,
  axis.title,
  axis.title.x,
  axis.title.x.top,
  axis.title.x.bottom,
  axis.title.y,
  axis.title.y.left,
  axis.title.y.right,
  axis.text,
  axis.text.x,
  axis.text.x.top,
  axis.text.x.bottom,
  axis.text.y,
  axis.text.y.left,
  axis.text.y.right,
  axis.ticks,
  axis.ticks.x,
  axis.ticks.x.top,
  axis.ticks.x.bottom,
  axis.ticks.y,
  axis.ticks.y.left,
  axis.ticks.y.right,
  axis.ticks.length,
  axis.ticks.length.x,
  axis.ticks.length.x.top,
  axis.ticks.length.x.bottom,
  axis.ticks.length.y,
  axis.ticks.length.y.left,
  axis.ticks.length.y.right,
  axis.line,
  axis.line.x,
  axis.line.x.top,
  axis.line.x.bottom,
  axis.line.y,
  axis.line.y.left,
  axis.line.y.right,
  legend.background,
  legend.margin,
  legend.spacing,
  legend.spacing.x,
  legend.spacing.y,
  legend.key,
  legend.key.size,
  legend.key.height,
  legend.key.width,
  legend.text,
  legend.text.align,
  legend.title,
  legend.title.align,
  legend.position,
  legend.direction,
  legend.justification,
  legend.box,
  legend.box.just,
  legend.box.margin,
  legend.box.background,
  legend.box.spacing,
  panel.background,
  panel.border,
  panel.spacing,
  panel.spacing.x,
  panel.spacing.y,
  panel.grid,
  panel.grid.major,
  panel.grid.minor,
  panel.grid.major.x,
  panel.grid.major.y,
  panel.grid.minor.x,
  panel.grid.minor.y,
  panel.ontop,
  plot.background,
  plot.title,
  plot.title.position,
  plot.subtitle,
  plot.caption,
  plot.caption.position,
  plot.tag,
  plot.tag.position,
  plot.margin,
  strip.background,
  strip.background.x,
  strip.background.y,
  strip.clip,
  strip.placement,
  strip.text,
  strip.text.x,
  strip.text.x.bottom,
  strip.text.x.top,
  strip.text.y,
  strip.text.y.left,
  strip.text.y.right,
  strip.switch.pad.grid,
  strip.switch.pad.wrap,
  ...,
  complete = FALSE,
  validate = TRUE
)

參數

line

所有行元素(element_line())

rect

所有矩形元素(element_rect())

text

所有文本元素 (element_text())

title

所有標題元素:繪圖、軸、圖例(element_text();繼承自text)

aspect.ratio

麵板的長寬比

axis.title, axis.title.x, axis.title.y, axis.title.x.top, axis.title.x.bottom, axis.title.y.left, axis.title.y.right

軸標簽 (element_text())。指定所有軸的標簽 ( axis.title )、按平麵的標簽(使用 axis.title.xaxis.title.y )或為每個軸單獨指定標簽(使用 axis.title.x.bottomaxis.title.x.topaxis.title.y.leftaxis.title.y.right )。 axis.title.*.* 繼承自 axis.title.*axis.title.* 又繼承自 axis.title ,而 axis.title 又繼承自 text

axis.text, axis.text.x, axis.text.y, axis.text.x.top, axis.text.x.bottom, axis.text.y.left, axis.text.y.right

沿軸勾選標簽 (element_text())。指定所有軸刻度標簽 ( axis.text )、按平麵刻度標簽(使用 axis.text.xaxis.text.y )或為每個軸單獨指定刻度標簽(使用 axis.text.x.bottomaxis.text.x.topaxis.text.y.leftaxis.text.y.right )。 axis.text.*.* 繼承自 axis.text.*axis.text.* 又繼承自 axis.text ,而 axis.text 又繼承自 text

axis.ticks, axis.ticks.x, axis.ticks.x.top, axis.ticks.x.bottom, axis.ticks.y, axis.ticks.y.left, axis.ticks.y.right

沿軸的刻度線 (element_line())。指定所有刻度線 ( axis.ticks )、按平麵刻度(使用 axis.ticks.xaxis.ticks.y )或為每個軸單獨指定(使用 axis.ticks.x.bottomaxis.ticks.x.topaxis.ticks.y.leftaxis.ticks.y.right )。 axis.ticks.*.* 繼承自 axis.ticks.*axis.ticks.* 又繼承自 axis.ticks ,而 axis.ticks 又繼承自 line

axis.ticks.length, axis.ticks.length.x, axis.ticks.length.x.top, axis.ticks.length.x.bottom, axis.ticks.length.y, axis.ticks.length.y.left, axis.ticks.length.y.right

刻度線的長度 (unit)

axis.line, axis.line.x, axis.line.x.top, axis.line.x.bottom, axis.line.y, axis.line.y.left, axis.line.y.right

沿軸的線(element_line())。指定沿所有軸 ( axis.line ) 的線、每個平麵的線(使用 axis.line.xaxis.line.y )或單獨為每個軸指定線(使用 axis.line.x.bottomaxis.line.x.topaxis.line.y.leftaxis.line.y.right )。 axis.line.*.* 繼承自 axis.line.*axis.line.* 又繼承自 axis.line ,而 axis.line 又繼承自 line

legend.background

圖例背景(element_rect();繼承自rect)

legend.margin

每個圖例周圍的邊距 (margin())

legend.spacing, legend.spacing.x, legend.spacing.y

圖例之間的間距 (unit)。 legend.spacing.xlegend.spacing.y 繼承自 legend.spacing 或可以單獨指定

legend.key

圖例鍵下方的背景(element_rect();繼承自rect)

legend.key.size, legend.key.height, legend.key.width

圖例鍵的大小(unit);關鍵背景高度和寬度繼承自legend.key.size或可以單獨指定

legend.text

圖例項標簽(element_text();繼承自text)

legend.text.align

圖例標簽的對齊方式(數字從 0(左)到 1(右))

legend.title

圖例標題(element_text();繼承自title)

legend.title.align

圖例標題的對齊方式(從 0(左)到 1(右)的數字)

legend.position

圖例的位置("none"、"left"、"right"、"bottom"、"top" 或二元素數值向量)

legend.direction

圖例中項目的布局("horizontal" 或 "vertical")

legend.justification

用於將圖例定位在繪圖內部的錨點("center" 或二元素數值向量)或定位在繪圖外部時根據繪圖區域進行的調整

legend.box

多個圖例的排列("horizontal" 或 "vertical")

legend.box.just

當有多個圖例("top"、"bottom"、"left" 或 "right")時,整個邊界框中每個圖例的對齊方式

legend.box.margin

整個圖例區域周圍的邊距,使用 margin() 指定

legend.box.background

圖例區域的背景(element_rect();繼承自rect)

legend.box.spacing

繪圖區域和圖例框之間的間距(unit)

panel.background

繪圖區域的背景,繪製在圖下方(element_rect();繼承自rect)

panel.border

繪圖區域周圍的邊框,繪製在繪圖頂部,以便覆蓋刻度線和網格線。這應該與 fill = NA 一起使用( element_rect() ;繼承自 rect )

panel.spacing, panel.spacing.x, panel.spacing.y

小平麵麵板之間的間距 (unit)。 panel.spacing.xpanel.spacing.y 繼承自panel.spacing,也可以單獨指定。

panel.grid, panel.grid.major, panel.grid.minor, panel.grid.major.x, panel.grid.major.y, panel.grid.minor.x, panel.grid.minor.y

網格線(element_line())。分別指定主網格線或次網格線(使用 panel.grid.majorpanel.grid.minor ),或為每個軸單獨指定主網格線或次網格線(使用 panel.grid.major.xpanel.grid.minor.xpanel.grid.major.ypanel.grid.minor.y )。 Y 軸網格線是水平的,x 軸網格線是垂直的。 panel.grid.*.* 繼承自 panel.grid.* ,而 panel.grid.* 又繼承自 panel.grid ,而 panel.grid 又繼承自 line

panel.ontop

將麵板(背景、網格線)放置在數據層上的選項(logical)。通常與透明或空白 panel.background 一起使用。

plot.background

整個情節的背景(element_rect();繼承自rect)

plot.title

繪圖標題(文本外觀)( element_text() ;繼承自 title )默認左對齊

plot.title.position, plot.caption.position

情節標題/副標題和標題的對齊。 plot.title.position 的設置適用於標題和副標題。值"panel"(默認值)表示標題和/或說明文字與繪圖麵板對齊。 "plot" 值表示標題和/或說明文字與整個繪圖對齊(減去邊距和繪圖標簽的任何空間)。

plot.subtitle

繪圖副標題(文本外觀)( element_text() ;繼承自 title )默認左對齊

plot.caption

繪圖下方的標題(文本外觀)( element_text() ;繼承自 title )默認右對齊

plot.tag

用於標識繪圖的左上標簽(文本外觀)(element_text();繼承自title)默認左對齊

plot.tag.position

標簽的位置作為字符串("topleft"、"top"、"topright"、"left"、"right"、"bottomleft"、"bottom"、"bottomright)或坐標。如果是字符串,則需要額外空格將添加以容納標簽。

plot.margin

整個圖周圍的邊距(unit 具有上、右、下、左邊距的大小)

strip.background, strip.background.x, strip.background.y

構麵標簽的背景(element_rect();繼承自rect)。水平麵背景 ( strip.background.x ) 和垂直麵背景 ( strip.background.y ) 繼承自 strip.background 或可以單獨指定

strip.clip

條帶背景邊和條帶標簽是否應該剪裁到條帶背景的延伸範圍?選項包括 "on" 進行剪輯、"off" 禁用剪輯或 "inherit"(默認)從父視口獲取剪輯設置。

strip.placement

條帶相對於軸的放置,"inside" 或"outside"。僅當軸和條位於圖的同一側時才重要。

strip.text, strip.text.x, strip.text.y, strip.text.x.top, strip.text.x.bottom, strip.text.y.left, strip.text.y.right

分麵標簽(element_text();繼承自text)。水平麵標簽 ( strip.text.x ) 和垂直麵標簽 ( strip.text.y ) 繼承自 strip.text 或可以單獨指定。 Facet strips 具有專用的 position-dependent 主題元素( strip.text.x.topstrip.text.x.bottomstrip.text.y.leftstrip.text.y.right ),它們分別繼承自 strip.text.xstrip.text.y 。因此,一些主題樣式需要應用於 position-dependent 元素而不是父元素

strip.switch.pad.grid

切換條帶時條帶和軸之間的空間(unit)

strip.switch.pad.wrap

切換條帶時條帶和軸之間的空間(unit)

...

附加元素規範不屬於基本 ggplot2 的一部分。一般來說,這些也應該在 element tree 參數中定義。

complete

如果這是一個完整的主題,例如 theme_grey() 返回的主題,請將其設置為 TRUE 。添加到 ggplot 對象時,完整主題的行為有所不同。此外,當設置complete = TRUE時,所有元素都將被設置為從空白元素繼承。

validate

TRUE 運行 validate_element()FALSE 繞過檢查。

主題傳承

主題元素按層次繼承其他主題元素的屬性。例如, axis.title.x.bottom 繼承自 axis.title.x ,而 axis.title.x 又繼承自 axis.title ,而 axis.title 又繼承自 text 。所有文本元素直接或間接繼承自text;所有線條均繼承自 line ,所有矩形對象均繼承自 rect 。這意味著您可以通過設置單個高級組件來修改多個元素的外觀。

vignette("ggplot2-specs") 中了解有關設置這些美學的更多信息。

也可以看看

+.gg()%+replace%element_blank()element_line()element_rect()element_text() 了解特定主題元素的詳細信息。

例子

p1 <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  labs(title = "Fuel economy declines as weight increases")
p1


# Plot ---------------------------------------------------------------------
p1 + theme(plot.title = element_text(size = rel(2)))

p1 + theme(plot.background = element_rect(fill = "green"))


# Panels --------------------------------------------------------------------

p1 + theme(panel.background = element_rect(fill = "white", colour = "grey50"))

p1 + theme(panel.border = element_rect(linetype = "dashed", fill = NA))

p1 + theme(panel.grid.major = element_line(colour = "black"))

p1 + theme(
  panel.grid.major.y = element_blank(),
  panel.grid.minor.y = element_blank()
)


# Put gridlines on top of data
p1 + theme(
  panel.background = element_rect(fill = NA),
  panel.grid.major = element_line(colour = "grey50"),
  panel.ontop = TRUE
)


# Axes ----------------------------------------------------------------------
# Change styles of axes texts and lines
p1 + theme(axis.line = element_line(linewidth = 3, colour = "grey80"))

p1 + theme(axis.text = element_text(colour = "blue"))

p1 + theme(axis.ticks = element_line(linewidth = 2))


# Change the appearance of the y-axis title
p1 + theme(axis.title.y = element_text(size = rel(1.5), angle = 90))


# Make ticks point outwards on y-axis and inwards on x-axis
p1 + theme(
  axis.ticks.length.y = unit(.25, "cm"),
  axis.ticks.length.x = unit(-.25, "cm"),
  axis.text.x = element_text(margin = margin(t = .3, unit = "cm"))
)


# \donttest{
# Legend --------------------------------------------------------------------
p2 <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point(aes(colour = factor(cyl), shape = factor(vs))) +
  labs(
    x = "Weight (1000 lbs)",
    y = "Fuel economy (mpg)",
    colour = "Cylinders",
    shape = "Transmission"
   )
p2


# Position
p2 + theme(legend.position = "none")

p2 + theme(legend.justification = "top")

p2 + theme(legend.position = "bottom")


# Or place legends inside the plot using relative coordinates between 0 and 1
# legend.justification sets the corner that the position refers to
p2 + theme(
  legend.position = c(.95, .95),
  legend.justification = c("right", "top"),
  legend.box.just = "right",
  legend.margin = margin(6, 6, 6, 6)
)


# The legend.box properties work similarly for the space around
# all the legends
p2 + theme(
  legend.box.background = element_rect(),
  legend.box.margin = margin(6, 6, 6, 6)
)


# You can also control the display of the keys
# and the justification related to the plot area can be set
p2 + theme(legend.key = element_rect(fill = "white", colour = "black"))

p2 + theme(legend.text = element_text(size = 8, colour = "red"))

p2 + theme(legend.title = element_text(face = "bold"))


# Strips --------------------------------------------------------------------

p3 <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  facet_wrap(~ cyl)
p3


p3 + theme(strip.background = element_rect(colour = "black", fill = "white"))

p3 + theme(strip.text.x = element_text(colour = "white", face = "bold"))

# More direct strip.text.x here for top
# as in the facet_wrap the default strip.position is "top"
p3 + theme(strip.text.x.top = element_text(colour = "white", face = "bold"))

p3 + theme(panel.spacing = unit(1, "lines"))

# }
源代碼:R/theme.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Modify components of a theme。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。