最近在做的分析很常需要利用自定義顏色來畫圖,每次都來問ChatGPT和Copilot到底怎麼寫,於是想說好好地來整理一下 語言的繪圖工具 R 中相關的函數和用法。ggplot2
首先每次都沒搞楚就亂用的是 _color_ 系列的函數和 _fill_ 系列的函數(哈哈哈真的很亂來)。
- 前者改變的是
"color"屬性1 2,控制線條3、圓點4等的顏色。 - 後者改變的是
"fill"屬性,控制棒形圖等圖形內填充的顏色。- 棒形圖裡柱子的外框的話,也是線條,所以也可以通過改變
"color"屬性來設定外框顏色。
- 棒形圖裡柱子的外框的話,也是線條,所以也可以通過改變
"color" 屬性 vs "fill" 屬性
先來看看官方教學中的幾個例子,應該很快就能了解這兩個屬性如何控制圖形的外觀。
例子1:設定棒形圖柱子顏色
- 由於目的是想改變柱子內填充的顏色,因此可以通過設定
"fill"屬性來完成。 - 屬性值可以使用如
"red"等等內置的顏色,也可以直接輸入選好的HEX code。 - 如果想把柱子變為透明,則可以把
"fill"屬性設為NA。 - 如果只想改變填充顏色的透明度,可以利用HEX code來設定(
"#RRGGBBAA"中的"AA"5)
圖一
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar(fill = "#8B5CCC") +
theme_classic()

例子2:設定棒形圖外框顏色
- 由於目的是想改變柱子外框的顏色,是線條的顏色,因此可以通過設定
"color"屬性來完成。
圖二
ggplot(mtcars, aes(x = factor(cyl))) +
geom_bar(fill = 'white', color = "steelblue") +
theme_classic()

例子3:分組設為不同顏色
- 上述例子中已經把資料按
cyl分別畫出棒形圖,如果想進一步按另一列vs的分組,再分別以不同顏色畫出,則可以在aes中進一步設定"fill"屬性。
圖三
ggplot(mtcars, aes(x = factor(cyl),
fill = factor(vs))) +
geom_bar() +
theme_classic()

- 那麼,如果我們想把預設的紅色和藍色,改為自己選擇的顏色呢?
- 這可以通過另一函數
scale_fill_manual()中設定。這裡可以看到這個函數的名字中,有_fill_,說明他改變的是圖像中的"fill"屬性。
圖三.變形一
ggplot(mtcars, aes(x = factor(cyl),
fill = factor(vs))) +
geom_bar() +
scale_fill_manual(values = c("#96bf69", "#9269bf")) +
theme_classic()

- 如果想把堆疊形棒形圖(stacked barplot)改成並列形棒形圖,那麼可以把
position設定成"dodge"。
圖三.變形二 6
ggplot(mtcars, aes(x = factor(cyl),
fill = factor(vs))) +
geom_bar(position = "dodge") +
scale_fill_manual(values = c("#96bf69", "#9269bf")) +
theme_classic()

例子4:散點圖
- 在
中,圓點可以被當成由線條組成,因此圓點的顏色是由ggplot2"color"屬性所控制的。
圖四
ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
geom_point() +
theme_classic()

- 所以如果把
aes中的"color"改成了"fill",那麼圓點都會以黑色顯示。
圖四.變形一
ggplot(mtcars, aes(x = wt, y = mpg, fill = factor(cyl))) +
geom_point() +
theme_classic()

例子5:線圖
- 線條顏色由
"color"控制。
圖五
ggplot(economics, aes(x = date, y = unemploy)) +
geom_line(color = "#C95D93") +
theme_classic()

下篇文章再詳細來看 _color_ 系列和 _fill_ 系列的函數吧。
參考資料、延伸閱讀:
- 官方指南
- Chang, W. R Graphics Cookbook, 2nd edn. (O’Reilly Media, Inc., 2018).
- Chapter 12: Using colors in plots.

Leave a Reply