【问题标题】:ggplot: xlim and scale_x_continuous in histogramggplot:直方图中的 xlim 和 scale_x_continuous
【发布时间】:2021-06-28 19:14:09
【问题描述】:

我有一个随机正态变量bob_commute_duration_minutes 的 ggplot 直方图,平均值为 30,标准差为 10(如果重要,它是 Shiny 应用程序的一部分)。我想将直方图的视觉限制为 +/- 3SD。我有这个:

outdf_r() %>% ggplot(aes(x = bob_commute_duration_minutes,
             fill= dplyr::if_else(bob_commute_duration_minutes>=input$commutemean,"Above Average","Below Average"))) +
  geom_histogram(bins=100) + 
 # ggtitle(paste( mean(outdf_r()$bob_commute_duration_minutes), sd(outdf_r()$bob_commute_duration_minutes),sep=","))+
  ggtitle("Bob's Commute Time Histogram (2SD Marked, 3SD Clipped)") +
  guides(fill=guide_legend(title="Commute Above or Below Average"))+
  xlab("Bob's Commute Time")+
  xlim((input$commutemean- 3*input$commutesd),(input$commutemean + 3*input$commutesd)) +
  geom_vline(xintercept=(input$commutemean- 2*input$commutesd),color="black") +
  geom_vline(xintercept=(input$commutemean+ 2*input$commutesd),color="black") 

到目前为止一切顺利;不显示极端异常值。 我还想编辑 x 轴,以便有更多刻度线。我尝试使用 scale_x_continuous ,中断的限制为 +/- 3SD 并且刻度线以 1 为单位,但这导致异常值再次显示。关于如何在 x 轴上制作更详细的刻度线,同时仍然隐藏距离平均值超过 3SD 的值有什么建议吗?

【问题讨论】:

  • xlim 之后运行scale_x_continuous 会覆盖对xlim 的调用。因此,删除xlim 调用并使用scale_x_continuous 中的limits 参数来设置限制。此外,请记住,使用scale_x_continuous(或等效地使用xlim)设置限制会从均值、回归线或任何其他汇总度量的计算中排除超出限制的数据。要设置限制而不排除数据,请使用coord_cartesian。有关更多详细信息,请参阅here
  • 成功了,谢谢@eipi10

标签: r ggplot2


【解决方案1】:

这是一种在scale_x_continuous 中定义中断和标签并在coord_cartesian 中定义可见范围的方法。

library(dplyr); library(ggplot2)

数据准备

outdf_r <- data.frame(bob_commute_duration_minutes = rnorm(2E4, 30, 10))
input <- outdf_r %>% summarize(commutemean = mean(bob_commute_duration_minutes),
                               commutesd = sd(bob_commute_duration_minutes))
x_range <- input$commutemean + input$commutesd * c(-3,3)

仅标记 5 的倍数的功能

label_5s <- function() {
  function(x) if_else(x %% 5 == 0, format(x), "")
}

代码

outdf_r %>% ggplot(aes(x = bob_commute_duration_minutes,
                         fill= dplyr::if_else(bob_commute_duration_minutes>=input$commutemean,"Above Average","Below Average"))) +
  geom_histogram(bins=100) + 
  ggtitle("Bob's Commute Time Histogram (2SD Marked, 3SD Clipped)") +
  guides(fill=guide_legend(title="Commute Above or Below Average"))+
  scale_x_continuous(breaks = 0:60, minor_breaks = 0, labels = label_5s()) +
  xlab("Bob's Commute Time")+
  coord_cartesian(xlim = x_range, expand = 0) +
  geom_vline(xintercept=(input$commutemean- 2*input$commutesd),color="black") +
  geom_vline(xintercept=(input$commutemean+ 2*input$commutesd),color="black") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多