R: ggplot2 отображает несколько кадров данных в одном графике - PullRequest
0 голосов
/ 29 ноября 2018

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

У меня есть несколько фреймов данных, я приведу только два примера.

Фрейм данных имеет одинаковый заголовок, но отличается.Допустим, я хочу посчитать шары, которые у меня есть, в 2 коробках.

name=c('red','blue','green','purple','white','black')
value1=c(2,3,4,2,6,8)
value2=c(1,5,7,3,4,2)

test1=data.frame("Color"=name,"Count"=value1)
test2=data.frame("Color"=name,"Count"=value2)

Я пытаюсь сделать гистограмму своего счета.На данный момент, что я сделал, это:

(plot_test=ggplot(NULL, aes(x= Color, y=Count)) + 
    geom_bar(data=test1,stat = "identity",color='green')+
    geom_bar(data=test2,stat = "identity",color='blue')
)

Problem is that my plots are overlapping themselves

Я хочу, чтобы x = Color и y = Count, и гистограмма фрейма данных test2рядом с test1.Здесь они перекрывают себя.Таким образом, у меня будет одно и то же имя дважды в x, но я хочу отобразить фреймы данных в несколько цветов и получить в легенде имя.

Например, "Зеленая полоса" = test1 "Синяя полоса" = test2

Спасибо за ваше время и вашу помощь.

С уважением

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

У вас есть два варианта:

Либо отрегулируйте размер и положение баров

ggplot(NULL, aes(x= Color, y=Count)) + 
geom_bar(data=test1, aes(color='test1'), stat = "identity",
         width=.4, position=position_nudge(x = -0.2)) +
geom_bar(data=test2, aes(color='test2'), stat = "identity", 
         width=.4, position=position_nudge(x = 0.2))

enter image description here, либо я рекомендую соединить двакадры данных вместе, а затем построить

library(dplyr)
test1 %>% 
  full_join(test2, by = 'Color') %>% 
  data.table::melt(id.vars = 'Color') %>% 
  ggplot(aes(x= Color, y=value, fill = variable)) + 
  geom_bar(stat = "identity", position = 'dodge')

enter image description here

0 голосов
/ 29 ноября 2018

Это будет делать то, что вы пытались сделать:

balls <- data.frame(
  count = c(c(2,3,4,2,6,8),c(1,5,7,3,4,2)),
  colour = c(c('red','blue','green','purple','white','black'),c('red','blue','green','purple','white','black')),
  box = c(rep("1", times = 6), rep("2", times = 6))
)

ggplot(balls, aes(x = colour, y = count, fill = box)) +
  geom_col() +
  scale_fill_manual(values = c("green","blue"))

Это лучше, потому что это облегчает сравнение между количеством ящиков:

ggplot(balls, aes(x = colour, y = count)) +
  geom_col() +
  facet_wrap(~ box, ncol = 1, labeller = as_labeller(c("1" = "Box #1", "2" = "Box #2")))
0 голосов
/ 29 ноября 2018

Попробуйте это:

name=c('red','blue','green','purple','white','black')
value1=c(2,3,4,2,6,8)
value2=c(1,5,7,3,4,2)

test1=data.frame("Color"=name,"Count"=value1)
test2=data.frame("Color"=name,"Count"=value2)

test1$var <- 'test1'
test2$var <- 'test2'

test_all <- rbind(test1,test2)


(plot_test=ggplot(data=test_all) + 
  geom_bar(aes(x=Color,y=Count,color=var),
           stat = "identity", position=position_dodge(1))+
  scale_color_manual(values = c('green', 'blue'))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...