Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何在ggplot2中为几何图形的边框上色以避免重叠?_R_Ggplot2 - Fatal编程技术网

R 如何在ggplot2中为几何图形的边框上色以避免重叠?

R 如何在ggplot2中为几何图形的边框上色以避免重叠?,r,ggplot2,R,Ggplot2,我想给ggplot2中条形图的边框上色 下面的脚本是一个示例 如您所见,橙色边框与蓝色边框重叠。 有没有办法避免这种行为并在图形中为边框上色 图书馆(tidyverse) dat由于x轴上已经有dx,因此无需对其着色或填充 ggplot(dat) + geom_col(aes(x = dx, y = num, fill = test)) 解决问题的一个简单方法是在现有的条形图上画一个条形图。然后,新层只包含一个测试组,该组的值会稍微减小。刚好足够使边界不会重叠 dat %>%

我想给ggplot2中条形图的边框上色

下面的脚本是一个示例

如您所见,橙色边框与蓝色边框重叠。 有没有办法避免这种行为并在图形中为边框上色


图书馆(tidyverse)

dat由于x轴上已经有dx,因此无需对其着色或填充

ggplot(dat) +
  geom_col(aes(x = dx, y = num, fill = test))

解决问题的一个简单方法是在现有的条形图上画一个条形图。然后,新层只包含一个测试组,该组的值会稍微减小。刚好足够使边界不会重叠

dat %>%
  ggplot2::ggplot(ggplot2::aes(x=dx,y=num,fill=dx,color=test)) +
  ggplot2::geom_bar(stat="identity",size=1) +
  ggplot2::geom_bar(dat=dat %>% 
                      dplyr::filter(test=="T+") %>%
                      dplyr::mutate(num2=num-5),
                    ggplot2::aes(y=num2),stat="identity",size=1) +
  ggplot2::scale_color_manual(values=c("blue","orange"))
更干净的方法可能是避开栅栏,然后使用position_dodge(我不知道堆叠栅栏的等效方法)


问题在于,条形图是用
grid::rectGrob
构建的,当您将
rectGrob
的轮廓放大时,它会随之增长。由于线条是固定的点大小,但条本身不是(如果您更改窗口大小,您将看到),因此没有简单的方法来收缩
rectGrob
s以补偿这一点,从而允许内部大纲。因此,这实际上是一个比最初看起来更难解决的问题。当然,这不是不可能的,但您有三个选择:

  • 选择不同的打印方式(如
    位置\减淡
  • 通过临时破解,达到你想要的效果
  • 写一个全新的geom来达到这个效果(或者找到一个已经做到了这一点的包)
  • 如果这只是一个一次性的,并且你渴望为你的情节追求一种特殊的外观,我肯定会选择选项2。下面是一个如何实现的示例:

    ggplot(dat) +
      geom_col(aes(x = dx, y = num, fill = dx, color = test),
               size = 3) +
      scale_color_manual(values = c("orange","blue")) +
      geom_segment(aes(x = 0.53, y = 100, xend = 1.465, yend = 100), 
                   size = 3, colour = "blue") +
      geom_segment(aes(x = 0.53, y = 120, xend = 1.465, yend = 120), 
                   size = 3, colour = "orange") +
      geom_segment(aes(x = 1.53, y = 40, xend = 2.465, yend = 40), 
                   size = 3, colour = "blue") +
      geom_segment(aes(x = 1.53, y = 60, xend = 2.465, yend = 60), 
                   size = 3, colour = "orange") 
    

    看看如何在堆叠的geom_col中“分隔”类别仍然很有趣。@Paul。也许是
    geom_mosaic
    ?@Edward。谢谢你的评论。我想展示两个条形图来说明测试的敏感性和特异性将如何影响疾病前后的概率。所以,我试着用一个厚厚的边框把图的区域包起来。我查找了您推荐的ggmosaic软件包,发现它在我的情况下非常有用。这个问题非常相关,但诀窍是使用条形图边框,这并不是你真正想要的……最近的一个问题使用了相同的技巧。虽然听起来不像是传教士,但条形图中的条形图不应该有任何边框。base R默认值实际上包括它们,尽管它们很薄,但包含它们完全违背了Edward Tufte的许多数据可视化规则之一。@Paul。谢谢你提到其他问题。“我发现在这些问题上使用的技巧也很有帮助。”爱德华。感谢您对数据可视化规则的评论。我将查看规则,看看我的可视化是否适合用例。非常感谢您的回答和对
    geom_段
    s'美学中位置的微调。如果我有能力获得3分,那就太好了,但不幸的是,我没有,所以,我认为你的回答对这个问题来说是最好的。谢谢你的回答!您的第一个解决方案实际上适用于行大小为1的情况,但对于较大的值,仍然存在重叠。但这很好,不需要微调线条的位置。如果线条大小大于1,则“只需”调整从num中减去的值。。。试错:D
    ggplot(dat) +
      geom_col(aes(x = dx, y = num, fill = dx, color = test),
               size = 3) +
      scale_color_manual(values = c("orange","blue")) +
      geom_segment(aes(x = 0.53, y = 100, xend = 1.465, yend = 100), 
                   size = 3, colour = "blue") +
      geom_segment(aes(x = 0.53, y = 120, xend = 1.465, yend = 120), 
                   size = 3, colour = "orange") +
      geom_segment(aes(x = 1.53, y = 40, xend = 2.465, yend = 40), 
                   size = 3, colour = "blue") +
      geom_segment(aes(x = 1.53, y = 60, xend = 2.465, yend = 60), 
                   size = 3, colour = "orange")