Вопрос по ggplot2, colors, r – Добавить цвет на блок-график - ошибка «Непрерывное значение в дискретном масштабе»

38

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

Используя следующую команду, я смог создать следующий график коробочного графика и наложить его на отдельные точки данных:

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  geom_point(aes(color = Age))

Есть несколько вещей, которые я хотел бы добавить / изменить:

1. Измените цвет линии и / или заливку каждого прямоугольника (в зависимости от "возраста"), используя 6 различных цветов слева направо:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00")

Я старался

ggplot(data = MYdata, aes(Age, Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) 

но это приводит к"Continuous value supplied to discrete scale" ошибка.

2. Измените цвет каждой точки данных (в зависимости от «возраста»), используя 6 различных цветов слева направо:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00")

Я старался:

ggplot(data = MYdata, aes(Age, Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  geom_point(aes(color = Age)) + 
  scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) 

но это также приводит к ошибке:

Continuous value supplied to discrete scale

3. Измените текст в легенде на «0 месяцев», «1 месяц», «3 месяца», «6 месяцев», «9 месяцев», «12 месяцев»;

Ваш Ответ

1   ответ
51

предоставление данных образца поможет. Так как вы этого не сделали, вот некоторые из них:

MYdata <- data.frame(Age = rep(c(0,1,3,6,9,12), each=20),
                    Richness = rnorm(120, 10000, 2500))

Части 1 и 2 проистекают из той же проблемы.Age - это непрерывная переменная, но вы пытаетесь использовать ее в дискретной шкале (указав цвет для определенных значений возраста). В целом, шкала отображает переменную на визуальную; для непрерывного возраста существует соответствующий цвет для каждого возможного значения возраста, а не только для тех, которые появляются в ваших данных. Тем не менее, вы можете одновременно рассматривать возраст как категориальную переменную (фактор) для некоторых эстетики. Для третьей части вашего вопроса, в описании шкалы вы можете определить конкретные метки, соответствующие конкретным разрывам в шкале. Собираем все это вместе (и добавляем что-то, чтобы дать вам ось x, помеченную больше как то, что у вас есть в примере):

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(fill=factor(Age))) + 
  geom_point(aes(color = factor(Age))) +
  scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) +
  scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) +
  scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00"))

При такой цветовой схеме точки, попадающие в блок-график, не видны (поскольку они того же цвета, что и заливка блок-графика). Возможно, лучше оставить пустую коробку и нарисовать ее линии в цвете.

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(colour=factor(Age)), fill=NA) + 
  geom_point(aes(color = factor(Age))) +
  scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) +
  scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00"))

Наконец, подумайте, действительно ли вам нужно покрасить каждый возраст по-разному, так как они уже хорошо определены по оси X.

Большое спасибо, Брайан! Не знаю (пока), как генерировать случайный набор данных в R. Спасибо, что все равно это взяли! У меня есть дополнительный вопрос, основанный на вашем предложении не заполнять поля. Как я могу изменить цвет LINE для каждой коробки (например, на серый)? Я изменил цвет заливки с помощью geom_boxplot (aes (color = factor (Age)), fill = "gray80"). Затем попробовал scale_colour_manual (breaks = c ("0", "1", "3", "6", "9", "12"), значения = c ("gray80", "gray80", "gray80", " gray80 "," gray80 "," gray80 ")) но затем точки данных также стали серыми. Конечно, я бы хотел, чтобы точки были цветными. Dalmuti71
geom_boxplot(aes(position = factor(Age)), colour = "grey", fill = NA) илиgeom_boxplot(aes(group = factor(Age)), colour = "grey", fill = NA) Sandy Muspratt
Спасибо, Сэнди! Просто для моего собственного понимания: что делает "position = factor (Age)" или "group = factor (Age)", чтобы я мог определить цвет линии? Dalmuti71
group=factor(Age) говорит, что для каждого отдельного значения @ должно быть отдельное полAge (т. е. к возрасту следует относиться категорически, чтобы определить, какие существуют разные боксы). Я не знаю, что заposition=factor(Age) делает. Brian Diggs
@ Dalmuti71colour относится к линии / границе иfill относится к интерьеру. Играть сqplot(x,y,data, geom = "polygon") илиgeom="hist" чтобы четко показать разницу. isomorphismes

Похожие вопросы