Правильное использование scale fill manual () для создания разноцветных гистограмм в ggplot2?

у меня есть ряд файлов данных, которые я хотел бы изучить в R, каждый из которых я планирую использовать для создания фрейма данных с переменной столбца, который я обозначу для целей этого вопроса как foo. Диапазон foo лежит вдоль интервала [0, 7000]. В рамках моего исследования данных я хотел бы создать 1D гистограмму foo, но с небольшим поворотом: значения foo в диапазоне между (1000, 7000] особенно "интересны" для меня, и поэтому я хотел бы цветовой код отдельных баров гистограммы в этом диапазоне данных с использованием палитры цветов (т. е. потому, что позже я в конечном итоге намерен повторно использовать ту же палитру для отображения данных из некоторых других столбцов, которые я временно опустил из фрейма данных, чтобы мой вопрос не становился излишне сложным). И наоборот, значения foo в диапазоне [0,1000] мне не так интересны, однако я все равно хотел бы видеть их на гистограмме, хотя и окрашенных в серый цвет, в случаях где присутствуют какие-либо значения.

в моем примере кода ниже я создал искусственный фрейм данных образца и попытался построить гистограмму, используя ggplot2 выбор цвета заливки с помощью scale_fill_manual(). Я получил многоцветную гистограмму, однако она выглядит не так, как ожидалось:ggplot2 похоже, проигнорировал мои инструкции о том, где размещать разрывы между цветами. В частности, проблема, по-видимому, связана с отсутствующими данными: интервалы, у которых нет данных, не кажется, что они отображаются на цвет, хотя это было мое намерение, что они должны быть. Это также означает, что серый цвет заканчивается отображением на интервал (1000, 1500] вместо [0, 1000], как я намеревался.

мой вопрос: как я могу заставить ggplot2 назначить определенные коды заливки цвета определенным диапазонам данных, даже если некоторые интервалы пусты и не имеют данных, а гистограммы, соответствующие этим интервалам, поэтому не генерируются?

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

library(ggplot2)

# Minimum and maximum values of interest (for other data sets, additional
# values that are of lesser interest may fall within the interval [0, 1000])
lolim<-1000
hilim<-7000
bwdth<-500
# Construct sample data frame
df<-data.frame(foo=c(1200, 1300, 1750, 2200, 2300, 2750, 3200, 3300, 3750,
                     4200, 4300, 4750, 6200, 6300, 6750))
# Construct a discrete factor variable which can later be mapped onto
# discrete color codes
df$colcode<-cut(df$foo, breaks=c(0, seq(lolim, hilim, bwdth)),
                include.lowest=TRUE)

# Create the breaks and color codes to be used by scale_fill_manual()
brk<-levels(df$colcode)
ncol<-length(brk)
# My expectation is that "#808080FF" (gray) will map onto the range
# [0, 1000], while a palette consisting of 12 sequential shades of the
# rainbow will be mapped onto the range (1000, 7000], in intervals of 500
colors<-c("#808080FF", rainbow(ncol-1))

# Draw the histogram
print(ggplot(df, aes(foo)) +
        geom_histogram(aes(fill=colcode), binwidth=bwdth) +
        scale_fill_manual("", breaks=brk, values=colors))

Hand-annotated sample output

1 ответов


вы можете установить до FALSE. См.?discrete_scale: drop unused factor levels from the scale (TRUE or FALSE)

ggplot(df, aes(foo)) +
  geom_histogram(aes(fill = colcode), binwidth = bwdth) +
  scale_fill_manual("", breaks = brk, values = colors, drop = FALSE)

enter image description here