Прежде всего, вы собираетесь построить гистограмму, где высоты представлены значением , а не количеством наблюдений . См. Здесь для получения более подробной информации , но вы должны использовать geom_col
вместо geom_bar
.
С учетом сказанного, вы получаете ошибку, и результат потому, что кажется с x=norms_number+barwidth+0.03
вы пытаетесь указать точное позиционирование второго набора данных (df2
) относительно первого набора данных (df1
).
Чтобы ggplot
уклонился, он должен понимать, что использовать в качестве основы для уклонения, а затем он будет разделять (или «уклоняться») каждое наблюдение, содержащее одно и то же x=
aestheti c, на основе этой конкретной группы, использованной в качестве основы. В нормальных условиях вы должны указать в aes(
что-то вроде fill=
, а ggplot
достаточно умен, чтобы знать, что все, что вы установили как fill=
, также будет основой для работы position='dodge'
. при отсутствии этого (или если вы хотите отменить это) вам нужно будет указать group=
aestheti c, который будет использоваться для уклонения.
В конечном итоге это означает, что вам нужно объединить ваши наборы данных и предоставьте ggplot
способ решить, как увернуться. Это имеет смысл, поскольку оба ваших фрейма данных предназначены для размещения на одном графике, и оба имеют идентичный x
и y
эстетический вид. Если вы оставите их как отдельные фреймы данных, вы можете наложить их на один и тот же график, но нет хорошего способа использовать ggplot
position='dodge'
, потому что он должен видеть все данные в вызове geom_col
, чтобы знать, что использовать в качестве основы для уклонения.
С учетом всего сказанного, вот что я бы порекомендовал:
# combine datasets, but first make a marker called "origin"
# this will be used as a basis for the dodge and fill aesthetics
df1$origin <- 'df1'
df2$origin <- 'df2'
df <- rbind(df1, df2)
# need to change norms_number to a factor to allow for discrete axis
df$norms_number <- as.factor(df$norms_number)
Затем вы используете только один вызов geom_col
, ваш сюжет. В первом случае я буду использовать только group=
aestheti c, чтобы показать вам, как ggplot
использует это для механизма уклонения:
ggplot(df, aes(x=norms_number, y=R2.c)) +
geom_col(position='dodge', width=0.35, aes(group=origin), color='black')
Как уже упоминалось, вы также можете просто поставить fill=
aestheti c, и ggplot
будет знать, что использовать его как механизм для уклонения:
ggplot(df, aes(x=norms_number, y=R2.c)) +
geom_col(position='dodge', width=0.35, aes(fill=origin), color='black')