繁体   English   中英

如何在ggplot2中使用geom_bar将plot负数从小值到大值

[英]how to plot negative numbers from small to large value using geom_bar in ggplot2

我希望能够 plot 从左到右只使用负值的条形图。 低值在左侧,条形长度达到单个观察值。 如果我需要给出一个起始最小值,我可以这样做,在我下面提供的示例中说 -105。

由于某种原因,我无法使用 xlim 或 ylim 来控制比例

a <- as.factor(c("x","y","z"))
b <- c(-105, -87, -99)
neg_tib <- tibble(a,b)

neg_plot <- ggplot(neg_tib, aes(x = a, y = b))+
  geom_bar(stat = "identity",
           position = "identity", 
           color = "blue", fill = "transparent", 
           width = .1) +
  scale_y_continuous(breaks = c(-80, -100)) +
  coord_flip() +
  theme_tufte() 

在此处输入图像描述

您可以使用scale_y_reverse()而不是scale_y_continuous()来反转轴并获得反转条形的东西。 我还添加了每 -20 个单位的中断,以使其看起来更完整:

neg_plot <- ggplot(neg_tib, aes(x = a, y = b))+
  geom_bar(stat = "identity",
           position = "identity", 
           color = "blue", fill = "transparent", 
           width = .1) +
  scale_y_reverse(breaks = seq(0,-100, by=-20)) +
  coord_flip() +
  theme_tufte() 

在此处输入图像描述

强烈建议不要在条形图上设置轴限制,因为按照惯例,条形图“从 0 开始”。如果您想显示在轴上设置限制的位置,我建议使用其他几何对象(点、线等)。 . 取决于您的数据)。

然而,如果您绝对必须“放大”条形图的边缘,则可以在coord_flip()中设置限制。 为什么在那里? 您可以在scale_y_reverse(limits=c(...))中设置限制; 然而,就像其他scale_*函数一样,这些函数中的限制以及通过xlim()ylim()最终会放大您的数据并删除这些限制之外的任何数据点 这并不总是一个问题,但是对于barcol geom,例如,它们实际上0 开始并扩展到y美学。 因此,对于以 -105 结束的条形,geom 从 0 延伸到 -105。 这意味着当您在scale_y_reverse()ylim()内部使用limits=放大时,它会缩放轴,但它不再 plot 这些几何图形(因为它们超出了这些限制)。

要放大但保留所有几何图形,无论它们是否超出限制集,您可以在任何coord_* function 内设置这些限制。这包括coord_cartesian() ,或者在您的情况下, coord_flip() 这是放大后的样子。我还将y轴上的breaks设置得更小以适应不同的缩放:

neg_plot <- ggplot(neg_tib, aes(x = a, y = b))+
  geom_bar(stat = "identity",
           position = "identity", 
           color = "blue", fill = "transparent", 
           width = .1) +
  scale_y_reverse(breaks = seq(0,-100, by=-20)) +
  coord_flip() +
  theme_tufte() 

在此处输入图像描述

再次强调,以这种方式显示条形图是非常糟糕的做法 原因是在上面的 plot 中, z看起来大约是y值的两倍,而实际上z的值是 -99, y的值是 -87。 绝对不是y的两倍,除非您从 -80 处“开始”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM