R - 在 ggplot 中包含两个 y 轴

R - Including two y-axis in ggplot

谁能帮我在 ggplot 中添加第二个 y 轴,或者将我制作的两个单独的 ggplot 组合起来? (附加 R 代码)

数据: Dataframe = Deals1 包括三列(年份 = 日期,每年的交易数量 = N,每年的总交易价值 = total_tvalue)。

数据集包括 22 行(2000-2021 年),交易数量从 50-500 不等,交易价值从 100.000 到 800.000 不等

谢谢!

# Two seperate plots
plot1 = ggplot(Deals1, aes(x=Date, y=N)) + geom_bar(stat = "identity")

plot2 = ggplot(Deals1, aes(x=Date, y=total_tvalue, group = 1)) + geom_line(stat = "identity")



# Doesnt work
ggplot(Deals1, aes(x=Date)) + 
  geom_bar( aes(y=N), stat = "identity") + 
  geom_line( aes(y=total_tvalue))+
  scale_y_continuous(
    name = "Number of transactions",
    sec_axis(name = "Transaction value"))+
  ggtitle("M&A Activity")

> dput(Deals1)
structure(list(Date = c("2000", "2001", "2002", "2003", "2004", 
"2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", 
"2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", 
"2021"), N = c(428L, 337L, 222L, 243L, 220L, 228L, 230L, 215L, 
146L, 143L, 131L, 94L, 121L, 128L, 154L, 161L, 156L, 139L, 159L, 
121L, 74L, 95L), total_tvalue = c(796728L, 283487L, 124839L, 
199670L, 276307L, 412632L, 379802L, 224635L, 188737L, 292432L, 
141469L, 244239L, 126452L, 173573L, 404071L, 564486L, 400689L, 
376499L, 477247L, 591219L, 262643L, 166189L)), row.names = c(NA, 
-22L), class = "data.frame")

ggplot 中的辅助轴只是绘制在绘图一侧的惰性注释。它不会以任何方式影响实际绘图面板上的内容。

在您的情况下,如果您在同一面板上同时绘制条形图和线条,则看不到条形图,因为线条比它们大 1,000 倍。

要在这里使用辅助轴,我们必须将 tvalue 除以大约 1,000,以便它与 N 的比例大致相同。当然,这意味着任何阅读我们图表的人如果看我们的 y 轴,就会得到 tvalue 的错误数字。 这就是辅助轴的用武之地。我们指定辅助轴显示的数字比“实际”大 1,000 倍。

此外,您的绘图代码还需要一些其他调整。目前它根本不画线,因为年份是字符格式而不是数字,所以您需要使用 as.numeric(Date) 或添加 group = 1 到美学映射。其次geom_bar(stat = "identity")只是写geom_col

的长路
library(ggplot2)

ggplot(Deals1, aes(as.numeric(Date))) + 
  geom_col(aes(y = N), fill = "deepskyblue4", alpha = 0.8) + 
  geom_line(aes(y = total_tvalue / 1500), color = "orangered3", size = 1) +
  scale_y_continuous(
    name = "Number of transactions", breaks = 0:5 * 100,
    sec.axis = sec_axis(~.x * 1500, 
                        name = "Transaction value",
                        labels = function(x) {
                           paste0(scales::dollar(x/1000), "K")})) +
  ggtitle("M&A Activity") +
  theme_light(base_size = 16)