Выровнять точки данных с отсутствующими значениями в ggplot2 без фасетирования - PullRequest
3 голосов
/ 21 июня 2020

У меня есть фрейм данных, который (очень абстрактно) выглядит так. Обратите внимание, что не каждый дегустатор оценил каждый фрукт.

df <- data.frame(
  fruit = c("apple", "apple", "apple", "banana", "banana", "banana"),
  taster = c("Ann", "Bob", "Don", "Bob", "Cat", "Don"),
  rating = c(8, 7, 4, 6, 3, 7)
)

Я хочу создать два графика, используя ggplot2, один для яблок и один для бананов. Я хочу, чтобы баллы указывали на рейтинги, и эти точки нужно соединять линиями. Важно отметить, что даже несмотря на то, что Энн не оценивала бананы, а Кот не оценивал яблоки, я все же хочу, чтобы на обоих графиках были все четыре оценки по оси x. На графике яблока точка рейтинга Боба должна быть напрямую связана с точкой рейтинга Дона, пропуская столбец «Кошка». В банановом сюжете будет просто три связанных точки для Боба, Кота и Дона; в столбце Ann ничего не будет.

Я могу выполнить sh это фасетированием, например:

этот .

plot_facet <- ggplot(df, aes(x = taster, y = rating, col = fruit, group = fruit)) +
  geom_point() + geom_line() +
  scale_color_manual(values=c("#123456", "#abcdef")) +
  facet_grid(fruit ~ .)

Однако по сложной независимой причине я не хочу использовать фасетирование . Скорее, я хочу сделать два отдельных графика и сшить их вместе (например) ggarrange(). Но когда я это сделаю, результат будет:

Столбец Ann исключен из бананового графа, а столбец Cat из яблочного графа. Что мне не нравится в этом, так это то, что трудно визуально сравнить оценки одного человека за два фрукта.

plot_apple <- ggplot(subset(df, fruit == "apple"), 
                     aes(x = taster, y = rating, col = fruit, group = fruit)) +
  geom_point() + geom_line() +
  scale_color_manual(values=c("#123456"))

plot_banana <- ggplot(subset(df, fruit == "banana"), 
                     aes(x = taster, y = rating, col = fruit, group = fruit)) +
  geom_point() + geom_line() +
  scale_color_manual(values=c("#abcdef"))

ggarrange(plot_apple, plot_banana, ncol = 1, nrow = 2)

Как мне предотвратить это? Я пробовал добавлять в свой фрейм данных строки с пустыми значениями, но это не помогло.

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Другой, более хитрый вариант. (Я предпочитаю решение Аллана!). Это решение также требует сначала разложить переменную на множители! введите описание изображения здесь

2 голосов
/ 21 июня 2020

Вы можете преобразовать имена в множители, а затем использовать drop = FALSE в вызове scale_x_discrete. Вот репрезентация:

library(ggplot2)
library(ggpubr)

df <- data.frame(
  fruit = c("apple", "apple", "apple", "banana", "banana", "banana"),
  taster = c("Ann", "Bob", "Don", "Bob", "Cat", "Don"),
  rating = c(8, 7, 4, 6, 3, 7)
)

df$taster <- factor(df$taster)

plot_apple <- ggplot(subset(df, fruit == "apple"), 
                     aes(x = taster, y = rating, col = fruit, group = fruit)) +
  geom_point() + geom_line() +
  scale_color_manual(values=c("#123456"))+
  scale_x_discrete(drop = FALSE)

plot_banana <- ggplot(subset(df, fruit == "banana"), 
                      aes(x = taster, y = rating, col = fruit, group = fruit)) +
  geom_point() + geom_line() +
  scale_color_manual(values=c("#abcdef")) +
  scale_x_discrete(drop = FALSE)

ggarrange(plot_apple, plot_banana, ncol = 1, nrow = 2)

Created on 2020-06-20 by the репозиторий (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...