ggplot2-使用辅助轴将标签添加到第二张图

时间:2020-05-28 11:20:01

标签: r ggplot2

我想在图形和列上的红线中添加标签。 我设法将标签添加到列或行中,但是我不能同时做这两项。

有人可以帮忙吗?

测试数据框

           ebit ebit_margin year
Company1    2421    0.054   2019    
Company1.1  1928    0.049   2018    
Company1.2  1915    0.050   2017    
Company1.3  2135    0.060   2016    
Company1.4  1534    0.041   2015

数据

test <- structure(list(ebit = c(2421.459, 1928.349, 
1914.744, 2134.6, 1534.048), ebit_margin = c(0.05367, 0.04859, 
0.04973, 0.06016, 0.04143), year = structure(5:1, .Label = c("2015", 
"2016", "2017", "2018", "2019"), class = "factor")), class = "data.frame", row.names = c("Company1", 
"Company1", "Company1", "Company1", 
"Company1"))

代码

scaleFactor <- max(test$ebit) / max(test$ebit_margin)

ggplot(test, aes(as.factor(year), ebit, label=test$ebit)) + 
  geom_col(width = 0.5, fill = "darkblue", alpha = 0.5) +
  geom_line(aes(as.factor(year), ebit_margin * scaleFactor, group = 1),  size = 1,  col = "red", alpha = 0.5) +
  scale_y_continuous(name = "EBIT Value", sec.axis = sec_axis(~./scaleFactor, name = "EBIT Margin", labels = function(b) { paste0(round(b * 100, 3), "%")})) +
  #geom_text(size = 3, position = position_stack(vjust = 0.5)) + 
  theme_bw()  +
  labs(title = "Key Financials Across Years",
       subtitle = "Earnings Before Interest and Taxation",
       x = "Year") +
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
  geom_label(
    label = c(test$ebit),
    position = position_stack(vjust = 0.75),
    check_overlap = T
  )

到目前为止,我设法做到的是:

Current Outcome

2 个答案:

答案 0 :(得分:3)

您需要再添加一个geom_labely美观的第二个label

ggplot(test, aes(as.factor(year), ebit, label=test$ebit)) + 
  geom_col(width = 0.5, fill = "darkblue", alpha = 0.5) +
  geom_line(aes(as.factor(year), ebit_margin * scaleFactor, group = 1),  
            size = 1, col = "red", alpha = 0.5) +
  scale_y_continuous(name = "EBIT Value", 
                     sec.axis = sec_axis(~./scaleFactor, 
                     name = "EBIT Margin", 
                     labels = function(b) { 
                       paste0(round(b * 100, 3), "%")})) +
  theme_bw()  +
  labs(title = "Key Financials Across Years",
       subtitle = "Earnings Before Interest and Taxation",
       x = "Year") +
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
  geom_label(
    aes(label = ebit),
    position = position_stack(vjust = 0.75),
    check_overlap = T
  ) +
  geom_label(
    aes(label = ebit_margin * 100, y = ebit_margin * scaleFactor),
    colour = "red"
  )

enter image description here

答案 1 :(得分:1)

只需添加

  geom_label(
    aes(as.factor(year), ebit_margin * scaleFactor, group = 1),
    label = c(test$ebit),
    position = position_stack(vjust = 0.99),
    check_overlap = T
  )

您的结果将是

ggplot(test, aes(as.factor(year), ebit, label=test$ebit)) + 
  geom_col(width = 0.5, fill = "darkblue", alpha = 0.5) +
  geom_line(aes(as.factor(year), ebit_margin * scaleFactor, group = 1),  size = 1,  col = "red", alpha = 0.5) +
  scale_y_continuous(name = "EBIT Value", sec.axis = sec_axis(~./scaleFactor, name = "EBIT Margin", labels = function(b) { paste0(round(b * 100, 3), "%")})) +
  #geom_text(size = 3, position = position_stack(vjust = 0.5)) + 
  theme_bw()  +
  labs(title = "Key Financials Across Years",
       subtitle = "Earnings Before Interest and Taxation",
       x = "Year") +
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
  geom_label(
    label = c(test$ebit),
    position = position_stack(vjust = 0.75),
    check_overlap = T
  )+
  geom_label(
    aes(as.factor(year), ebit_margin * scaleFactor, group = 1),
    label = c(test$ebit),
    position = position_stack(vjust = 0.99),
    check_overlap = T
  )