Гистограмма - столбцы переместились на ось Y - PullRequest
0 голосов
/ 07 мая 2020

Я строил гистограмму с кодом, который отлично работал, пока некоторые данные не имели значение 0.

barwidth = 0.35

df1:
norms_number   R2.c 
1             0.011     
2             0         
3             0.015         
4             0.011         
5             0         
6             0.012

df2:
norms_number  R2.c
1           0.001           
2           0           
3           0.012           
4           0.006           
5           0           
6           0.004

test <- ggplot()+
geom_bar(data=df1, aes(x=norms_number, y=R2.c),stat="identity", position="dodge", width = barwidth)+
  geom_bar(data=df2, aes(x=norms_number+barwidth+0.03, y=R2.c), 
stat="identity",  position="dodge",width = barwidth)

мой результат был:

enter image description here

and I got a warning that position stack requires non-overlapping x intervals (but they are not overlapping?)

I looked into it and changed the DV to factor (from numeric), which half helped, because now the graph looks like this:

введите описание изображения здесь

почему полосы на оси y? как еще можно обойти эту странную ошибку со значениями 0?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Не очень уверен, пытаетесь ли вы нарисовать что-то более сложное, например, полосу над полосой и т.д.

ggplot()+
geom_rect(data=df1, 
aes(xmin=norms_number-barwidth,xmax=norms_number,
ymin=0,ymax=R2.c))+
geom_rect(data=df2, 
aes(xmin=norms_number,xmax=norms_number+barwidth,
ymin=0,ymax=R2.c))+
scale_x_continuous(breaks=1:6)

enter image description here

0 голосов
/ 07 мая 2020

Прежде всего, вы собираетесь построить гистограмму, где высоты представлены значением , а не количеством наблюдений . См. Здесь для получения более подробной информации , но вы должны использовать 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')

enter image description here

Как уже упоминалось, вы также можете просто поставить 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')

enter image description here

...