Как использовать ggplot2 geom_dotplot() как с заполнением, так и с группой

Мне очень нравится, как ggplot2::geom_dotplot() может красиво складывать точки в середину категории, но я не могу совмещать это с цветом заливки.

Давайте рассмотрим пример:

# test data
tmpData <- data.frame(x=c(rep('x', 3),rep('y', 3)), y=c(1,1,2,1,2,2), fill=rep(c('A', 'B', 'B'), 2))

# Plot without fill color
ggplot(tmpData, aes(x=x, y=y)) + 
    geom_dotplot(binaxis = "y", stackdir = "center", dotsize=4)

Результат на этом рисунке:

Dotplot without color

Но когда я добавляю аргумент fill:

ggplot(tmpData, aes(x=x, y=y, fill=fill)) +   
   geom_dotplot(binaxis = "y", stackdir = "center", dotsize=4)

Заполнение, похоже, перезаписывает группировку, сделанную на "x", в результате чего две точки (x, 1) (x, 1) будут свернуты. Я хотел бы, чтобы они имели разные цвета.

Dotplot with color

Когда я пытаюсь указать группу, цвет заливки игнорируется:

ggplot(tmpData, aes(x=x, y=y, group=x, fill=fill)) +
    geom_dotplot(binaxis = "y", stackdir = "center", dotsize=4)

Dotplot with group specified

Коллапс, похоже, можно избежать, включив группы стека:

ggplot(tmpData, aes(x=x, y=y, fill=fill)) +
    geom_dotplot(binaxis = "y", stackgroups=TRUE, stackdir = "center", dotsize=4)

dotpoot with stackgroups

Но затем я теряю центрирование данных на "x" и "y", которые находятся на других 3 графиках.

Есть ли способ использовать geom_dotplot() для обеих групп и заполнить?

Ответы

Ответ 1

Если вы открыты для немного хакерского решения, просто чтобы получить его, как вы хотите, чтобы он выглядел... Вы можете перезаписать команду заливки, просто предоставив ей вектор имен цветов:

tmpData$colorname <- rep(c('red','blue','blue'),2)

ggplot(tmpData, aes(x=x, y=y)) + 
  geom_dotplot(binaxis = "y", stackdir = "center", dotsize=4, fill=tmpData$colorname)

введите описание изображения здесь

Ответ 2

Я думаю, вы должны добавить аргумент position = "dodge":

 ggplot(tmpData, aes(x = x, y = y, fill = fill,)) +
  geom_dotplot(binaxis = "y", stackdir = "center", dotsize = 4, position = "dodge")

enter image description here