简介
最近科研中存在一个小需求:高亮柱状图中的某个柱子,从而展示所提方法的优越性(比如:比较RMSE,精确度等)。这该怎么做呢?
在询问 ChatGPT[1] 和 Bing[2] 搜索后,发现几种解决的办法:
- 直接使用 {
ggplot2
} 包中的scale_fill_manual()
函数来手动指定柱状图中某根柱子的颜色。 - 使用 {
ggcharts
} 包中的bar_chart()
和lollipop_chart()
中特定的highlight
参数。
接下来,来展示下这两种方法吧。
注意: ChatGPT 相关推文可见:利用 ChatGPT 回答 R 相关问题 ;数据分析的未来- ChatGPT 和 R;ChatGPT为何逆天?——OpenAI生成式语言模型的前世今生。
ggplot2 包
基础版本
下面是 ChatGPT 给出的答案,我来人工实现下。下面给出代码和结果。总体而言还是很不错的。
library(ggplot2) # 生成示例数据 df <- data.frame(category = c("A", "B", "C", "D"), value = c(10, 20, 30, 40)) # 将第三个类别的颜色指定为红色 highlight_color <- c("grey", "grey", "red", "grey") # 使用ggplot2创建柱状图 ggplot(df, aes(x = category, y = value, fill = category)) + geom_col() + scale_fill_manual(values = highlight_color)
进阶版本
问题:假设有四种方法(A:D),分别计算了对应的 RMSE 和 RB 结果。请使用 ggplot 绘制柱状图并高亮 RMSE 和 RB 最低的柱子。
模拟数据如下所示:
# 创建数据框 data <- data.frame( Method = c("A", "B", "C", "D"), RMSE = c(1.5, 2.3, 1.9, 2.1), RB = c(0.8, 1.2, 1.5, 0.7) ) head(data) # Method RMSE RB # 1 A 1.5 0.8 # 2 B 2.3 1.2 # 3 C 1.9 1.5 # 4 D 2.1 0.7 # 使用ggplot2创建柱状图 h1 <- c("red", "grey", "grey", "grey") p1 = ggplot(data, aes(x = Method, y = RMSE, fill = Method)) + geom_col() + scale_fill_manual(values = h1) h2 <- c("grey", "grey", "grey","red") p2 = ggplot(data, aes(x = Method, y = RB, fill = Method)) + geom_col() + scale_fill_manual(values = h2) library(cowplot) plot_grid(p1,p2)
注意:这是一个很初级的版本,由于组数不多就直接使用手工变化颜色。如果要做批
量处理,读者在此基础还得进行修改。
ggcharts 包
以上方法需要自己手动修改 scale_fill_manual()
中的参数,比较麻烦。现在来分享另一种思路:使用 ggcharts[3] 包中的 bar_chart()
和 lollipop_chart()
中特定的 highlight
参数。
先给出官方[4]的几个例子。
官方例子
数据来自 {ggcharts
} 包中的 biomedicalrevenue
数据。
library(ggcharts) library(dplyr) data("biomedicalrevenue") revenue2018 <- biomedicalrevenue %>% filter(year == 2018) head(revenue2018) # company year revenue #1 Johnson & Johnson 2018 81.60 #2 Roche 2018 56.86 #3 Pfizer 2018 53.60 #4 Novartis 2018 51.90 #5 Bayer 2018 45.06 #6 GlaxoSmithKline 2018 43.14
使用 bar_chart()
并设置 highlight = "Roche"
。
bar_chart( revenue2018, company, revenue, top_n = 10, highlight = "Roche" )
颜色主题可以通过修改 ggcharts
主题修改,比如:ggcharts_get_theme()
。
ggcharts_set_theme("theme_ng") bar_chart( revenue2018, company, revenue, top_n = 10, highlight = "Roche" )
注意:想变换到默认主题,可食用:
ggcharts_set_theme("theme_ggcharts")
。
当然也可以将其和分面结合,只需在参数中设置:facet = xxx
。
biomedicalrevenue %>% filter(year %in% c(2012, 2014, 2016, 2018)) %>% bar_chart( company, revenue, facet = year, top_n = 12, highlight = "Bayer" )
所提例子
根据上述学习,我们将该包应用到所提的例子中。
# 数据转化 data_long <- tidyr::gather(data, Metric, Value, -Method) head(data_long) # Method Metric Value # 1 A RMSE 1.5 # 2 B RMSE 2.3 # 3 C RMSE 1.9 # 4 D RMSE 2.1 # 5 A RB 0.8 # 6 B RB 1.2 data_long %>% bar_chart( Method, Value, facet = as.factor(Metric), top_n = 12, highlight = "A", horizontal = T )
问题:存在一个问题,如何使用改函数将每个指标的粉最低的方法高亮出来?
参考资料
[1]
ChatGPT: https://chat.openai.com/chat
[2]
Bing: https://www.bing.com/
[3]
ggcharts: https://thomas-neitmann.github.io/ggcharts/index.html
[4]
官方: https://thomas-neitmann.github.io/ggcharts/articles/highlight.html