R 使用geom_dotplot时打印区域被截断

R 使用geom_dotplot时打印区域被截断,r,ggplot2,R,Ggplot2,考虑以下示例数据: ex = structure(list(group = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L,

考虑以下示例数据:

ex = structure(list(group = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 1L, 
  2L, 3L, 4L, 6L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 
  2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 
  1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 
  5L, 6L, 1L, 2L, 1L, 2L, 3L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
  1L, 1L, 5L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 5L, 1L, 1L, 1L, 
  4L), .Label = c("A", "B", "C", "D", "E", "F"), class = "factor"), 
  ID = structure(c(35L, 35L, 35L, 35L, 35L, 35L, 1L, 1L, 1L, 
    1L, 1L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 9L, 9L, 
    9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 
    11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 
    13L, 13L, 14L, 14L, 14L, 14L, 14L, 14L, 21L, 21L, 22L, 22L, 
    22L, 22L, 2L, 3L, 4L, 5L, 8L, 15L, 16L, 17L, 18L, 19L, 19L, 
    20L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 30L, 31L, 32L, 
    33L, 34L), .Label = c("10", "107", "108", "109", "124", "17", 
      "18", "187", "19", "21", "24", "26", "27", "28", "335", "336", 
      "339", "340", "341", "342", "38", "39", "576", "577", "578", 
      "579", "580", "581", "582", "583", "584", "585", "586", "592", 
      "6"), class = "factor"), value = c(1L, 7L, 4L, 4L, 3L, 9L, 
        1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 5L, 1L, 2L, 1L, 2L, 2L, 
        2L, 1L, 33L, 27L, 28L, 21L, 28L, 1L, 3L, 1L, 1L, 1L, 1L, 
        2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 3L, 3L, 2L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L)), class = "data.frame", 
  row.names = c(NA, -88L), .Names = c("group", "ID", "value")
)
请注意,在组
A
中,每个
ID
value=1
。我使用
ggplot2
根据
变量的计数,使用
geom_dotplot
组的镶嵌面创建点图

ggplot(ex) + aes(x = value) + 
  geom_dotplot(binwidth = 1, method = "histodot") +
  facet_wrap(~ group)
即使使用
ggsave
导出,也会切断第一个面中的点堆栈。更改y轴限制没有效果,但更改纵横比使H>=W似乎可以解决问题(通常是通过向顶部添加比所需更多的空间)这是一个错误,还是我指定的点图不正确?

编辑

一种解决方法是通过
y
变量翻转我的点图和bin:

ggplot(ex) + aes(x = group, y = value) + 
  geom_dotplot(binwidth = 1, method = "histodot", 
    binaxis = "y", stackdir = "centerwhole") +     
  facet_wrap(~ group, scales = "free_x")

另外两个可以帮助您的参数是
stackratio
dotsize
。例如:

ggplot(ex) + aes(x = value) + 
  geom_dotplot(binwidth = 1, method = "histodot", stackratio = 0.9, dotsize = .75) +
  facet_wrap(~ group)  +
  scale_y_continuous(NULL, breaks = NULL)

你需要调整数字,直到你得到你想要的布局

我发现了一个有趣的解决方法,使用
geom_bar
实现了与点图相同的结构,但具有矩形:

ggplot(ex) + aes(x = value, group = ID) + 
  geom_bar(color = "black", fill = "white", width = 1) +
  facet_wrap(~ group) 

虽然它会生成矩形(而不是点),并且无法控制堆栈间距。根据绘图窗口调整矩形的大小,这相当于在
geom\u dotplot
中调整点大小。此外,它回避了一个问题:“为什么不使用常规条形图?”

hmm有趣。这是可行的,但我想这表明有bug?我希望
geom_dotplot
能够重新缩放y轴以捕获每个点…实际上,我想不是。。。这意味着
geom_dotplot
必须重新缩放点。我现在明白问题了。是的,我认为这取决于你希望dotsize是一个可以改变的固定值,而不是基于y进行缩放。这里的y轴并没有太大的意义,所以大部分的控制都是在点的大小。