ggplot2 (Barplot + LinePlot) - 双 Y 轴

Posted

技术标签:

【中文标题】ggplot2 (Barplot + LinePlot) - 双 Y 轴【英文标题】:ggplot2 (Barplot + LinePlot) - Dual Y axis 【发布时间】:2017-11-22 06:49:15 【问题描述】:

我很难用 ggplot2 重新创建一个 excel 示例。我尝试了很多例子,但由于某种原因,我无法达到我想要的结果。有人可以看看我的例子吗?

df <- structure(list(OccuranceCT = c(4825, 9063, 10635, 8733, 5594, 
2850, 1182, 376, 135, 30, 11), TimesReshop = structure(1:11, .Label = c("1x", 
"2x", "3x", "4x", "5x", "6x", "7x", "8x", "9x", "10x", "11x"), class = "factor"), 
    AverageRepair_HrsPerCar = c(7.48951898445596, 6.50803925852367, 
    5.92154446638458, 5.5703551356922, 5.38877037897748, 5.03508435087719, 
    4.92951776649746, 4.83878377659575, 4.67829259259259, 4.14746333333333, 
    3.54090909090909)), .Names = c("OccuranceCT", "TimesReshop", 
"AverageRepair_HrsPerCar"), row.names = c(NA, 11L), class = "data.frame")

到目前为止我的情节:

Plot <- ggplot(df, aes(x=TimesReshop, y=OccuranceCT)) +
  geom_bar(stat = "identity", color="red", fill="#C00000") +
  labs(x = "Car Count", y = "Average Repair Per Hour") + 
  geom_text(aes(label=OccuranceCT), fontface="bold", vjust=1.4, color="black", size=4) +
  theme_minimal()

Plot

这是我目前得到的:

而我想要实现的是:

如果能学习如何添加辅助轴并将条形图与线图结合起来,我将不胜感激。

【问题讨论】:

有人必须给出“双 y 轴不好”的讲座,所以它也可能是我 :) 他们直到最近才在 ggplot2 中实现,@GGamba 的回答显示了如何做。更多ggplot2 way 将是从宽幅重塑您的数据并在其自己的方面绘制每个变量。 你能解释一下如何从宽-长重塑数据吗?我想知道如何按照您描述的方式进行操作。谢谢尼尔! 当然,添加了答案。 【参考方案1】:

此答案是对您的评论的回复,而不是对原始问题的回复。

从宽到长重塑意味着我们有一列用于因变量(OccuranceCT、AverageRepair_HrsPerCar),另一列用于它们的值。然后我们可以将每一个都绘制成条形,在它们自己的方面,如下所示:

library(tidyr)
library(ggplot2)

df %>% 
  gather(variable, value, -TimesReshop) %>% 
  ggplot(aes(TimesReshop, value)) + 
    geom_col() + 
    facet_grid(variable ~ ., scales = "free")

这允许对变量进行快速的视觉比较,而不会因将具有完全不同值的不同变量放在同一个图中而产生潜在的误导性解释。

【讨论】:

尼尔,现在我完全明白了。感谢您简化并向我展示如何执行此操作。我明白你为什么建议这种方法了。【参考方案2】:

ggplot2 支持双轴(无论好坏),其中第二个轴是主轴的线性变换。

我们可以解决这个问题:

library(ggplot2)
ggplot(df, aes(x = TimesReshop)) +
  geom_col(aes( y = OccuranceCT, fill="redfill")) +
  geom_text(aes(y = OccuranceCT, label = OccuranceCT), fontface = "bold", vjust = 1.4, color = "black", size = 4) +
  geom_line(aes(y = AverageRepair_HrsPerCar * 1500, group = 1, color = 'blackline')) +
  geom_text(aes(y = AverageRepair_HrsPerCar * 1500, label = round(AverageRepair_HrsPerCar, 2)), vjust = 1.4, color = "black", size = 3) +
  scale_y_continuous(sec.axis = sec_axis(trans = ~ . / 1500)) +
  scale_fill_manual('', labels = 'Occurance', values = "#C00000") +
  scale_color_manual('', labels = 'Time Reshop', values = 'black') +
  theme_minimal()

【讨论】:

哇,真快。非常感谢GGamba。这正是我要找的!你能解释一下为什么你乘以 1500 并除以相同的数字。对于另一个示例,我如何计算出将来需要乘以多少?

以上是关于ggplot2 (Barplot + LinePlot) - 双 Y 轴的主要内容,如果未能解决你的问题,请参考以下文章

更改 ggplot2 barplot 中闪避条的顺序

R语言ggplot2可视化:可视化条形图(bar plot)并高亮(hightlight)需要突出的条形突出显示Barplot中的条Highlight a Bar in Barplot

在barplot ggplot2中个性化每个面上的填充颜色

R语言ggplot2可视化整体排序的水平堆叠条形图(Ordered Stacked Horizontal Barplot)

R语言ggplot2可视化整体排序的水平堆叠分离(dodge)条形图(Stacked Barplot Side By Side with position=dodge)

R语言ggplot2可视化水平条形图(horizontal bar plot)并且在条形图的条形上添加数值标签( Customizing labels on bars in barplot)