Две основные проблемы, которые у вас есть c, касаются вашей цветовой ошибки и не уклонения, и их можно решить, отформатировав аргумент scale_...(values=
, используя список вместо вектора, и применив group=
эстетика c, соответственно.
Вы увидите ответ на эти два вопроса на примере:
# dummy dataset
year <- c(rep(2017, 4), rep(2018, 4))
species <- rep(c('things', 'things1', 'wee beasties', 'ew'), 2)
values <- c(10, 5, 5, 4, 60, 10, 25, 7)
pt.value <- c(8, 7, 10, 2, 43, 12, 20, 10)
df <-data.frame(year, species, values, pt.value)
Я установил «значения» для своего столбца heights и я хотел использовать другую y aestheti c для очков в иллюстративных целях, называемую «pt.value». В остальном настройка данных аналогична вашей. Обратите внимание, что df$year
будет установлен как цифра c, поэтому лучше поменять его на формат даты (вроде бы больше проблем, чем здесь стоит), либо просто как фактор, поскольку «2017.5» не будет слишком большой смысл здесь :). Дело в том, что мне нужно, чтобы «год» был дискретным, а не непрерывным.
Решите цветовую ошибку
Для графика я постараюсь создать его похожим на вас. Обратите внимание, что в объекте scale_fill_manual
необходимо установить аргумент values=
, используя список . В вашем примере кода вы используете вектор (c()
) для указания цветов и именования. Если у вас есть name1=color1, name2=color2,...
, это представляет структуру списка.
ggplot(df, aes(x=as.factor(year), y=values)) +
geom_col(aes(fill=species), position=position_dodge(width=0.62), width=0.6) +
scale_fill_manual(values=
list('ew' = 'skyblue1', 'things' = 'dodgerblue',
'things1'='midnightblue', 'wee beasties' = 'gray')) +
geom_point(aes(y=pt.value), shape=24, position=position_dodge(width=0.62)) +
theme_bw() + labs(x='Year')
Таким образом, цвета применяются правильно, а моя ось дискретна, и значения у точек отображаются на pt.value
, как я и хотел, но почему бы точкам не уклоняться?!
Решить проблему уклонения
Уклонение - забавная вещь в ggplot2
. Лучшее объяснение, которое я могу вам здесь дать, заключается в том, что для столбцов и столбчатых диаграмм уклонение является своего рода «встроенным» в geom, поскольку положение по умолчанию - «stack», а «dodge» представляет альтернативный метод для рисования geom. Для точек, текста, надписей и других по умолчанию используется позиция «идентичность», и вам нужно более четко указать, как они собираются уклоняться, или они просто не уклоняются вообще.
По сути, мы нужно сообщить точкам , на что они уклоняются на основе. Это "виды"? С geom_col
предполагается, что с, но с geom_point
вам нужно указать. Мы делаем это с помощью group=
aestheti c, который позволяет geom_point
знать, что использовать в качестве критерия уклонения. Когда вы добавляете это, это работает!
ggplot(df, aes(x=as.factor(year), y=values, group=species)) +
geom_col(aes(fill=species), position=position_dodge(width=0.62), width=0.6) +
scale_fill_manual(values=
list('ew' = 'skyblue1', 'things' = 'dodgerblue',
'things1'='midnightblue', 'wee beasties' = 'gray')) +
geom_point(aes(y=pt.value), shape=24, position=position_dodge(width=0.62)) +
theme_bw() + labs(x='Year')