Почему так сложно сделать простой гистограмму в R?Как я могу легко превратить фрейм данных в барплот? - PullRequest
0 голосов
/ 02 марта 2019

У меня есть такой фрейм данных:

Categories        time a        time b      
Category 1        xxx.xx        xxx.xx
Category 2        xxx.xx        xxx.xx
.                 .             .
.                 .             .
.                 .             .
Category n        xxx.xx        xxx.xx

Все, что я хочу, - это создать простой сгруппированный линейный график времени a против времени b по категориям.Это не должно занимать больше строки кода и 5 минут моего времени.Как я могу сделать это просто?Все решения, которые я вижу, включают в себя целую кучу движущихся вещей, прежде чем я смогу их отобразить.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Минимальное решение, которое вы действительно хотите, существует в базе R.

Рассмотрите эти данные.

> head(dat, 3)
  Categories time.a time.b.
1  Category1  98.59   90.05
2  Category2 133.10  150.26
3  Category3  22.04   75.15

Сюжет:

barplot(t(dat[-1]), beside=TRUE, ylab="time")

Доходность

enter image description here

Затем вы можете уточнить его, как хотите, например,

rownames(dat) <- 1:10
barplot(t(dat[-1]), beside=TRUE, xlab="Categories", ylab="time", col=2:3)
legend("topleft", c("time a", "time b"), col=2:3, pch=15)

, что дает

enter image description here

Данные

dat <- structure(list(Categories = structure(c(1L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 2L), .Label = c("Category1", "Category10", "Category2", 
"Category3", "Category4", "Category5", "Category6", "Category7", 
"Category8", "Category9"), class = "factor"), time.a = c(98.59, 
133.1, 22.04, 10.24, 17.12, 78.21, 115.41, 76.84, 176.09, 73.02
), time.b. = c(90.05, 150.26, 75.15, 7.07, 1.85, 49.03, 7.41, 
152.89, 139.64, 90.98)), class = "data.frame", row.names = c(NA, 
-10L))
0 голосов
/ 02 марта 2019

R - надежный язык, и он может создавать очень богатые визуализации.Вся эта мощь означает, что у пользователя должно быть больше рычагов, чтобы тянуть, чтобы произвести желаемую визуализацию, которая усиливает кривую обучения.Это усугубляется тем фактом, что самая популярная библиотека визуализации R (ggplot) спроектирована таким образом, что это может показаться странным людям, пришедшим из более объектно-ориентированных языков или из программ для работы с электронными таблицами.

Я создал нечто вроде того, что ядумаю, что вы хотите.

df <- data.frame(cat=c("cat1", "cat2", "cat3", "cat4", "cat5", "cat6", "cat1", "cat2", "cat3", "cat4", "cat5", "cat6"),
             time_type=c("a","a","a","a","a","a","b","b","b","b","b","b"),
             time=c(12.7, 16, 8.6, 13.4, 7.3, 5.5, 6.8, 15, 33, 4.2, 10, 29.5))


head(df) 
        cat   time_type   time
    1   cat1  a           12.7
    2   cat2  a           16.0
    3   cat3  a           8.6   
    4   cat4  a           13.4  
    5   cat5  a           7.3   
    6   cat6  a           5.5   
    7   cat1  b           6.8
    8   cat2  b           15
    9   cat3  b           33
   10   cat4  b           4.2
   11   cat5  b           10
   12   cat6  b           29.5

и для создания графика

ggplot(data=df, aes(x=cat, y=time, fill=time_type)) +
  geom_bar(stat="identity", position=position_dodge())

barplot_in_r

edit:

И вы можете произвестиэтот фрейм данных из вашего исходного фрейма данных, подобный этому

df2 <- data.frame(cat=c("cat1", "cat2", "cat3", "cat4", "cat5", "cat6"),
                 time_a=c(12.7, 16, 8.6, 13.4, 7.3, 5.5),
                 time_b=c(6.8, 15, 33, 4.2, 10, 29.5))
head(df2)

    cat     time_a  time_b
1   cat1    12.7    6.8 
2   cat2    16.0    15.0    
3   cat3    8.6     33.0    
4   cat4    13.4    4.2 
5   cat5    7.3     10.0    
6   cat6    5.5     29.5    

И оттуда вы можете просто растопить свой фрейм данных следующим образом:

library(reshape2)
df3 <- melt(df2)
df3


cat     variable  value
cat1    time_a    12.7      
cat2    time_a    16.0      
cat3    time_a    8.6       
cat4    time_a    13.4      
cat5    time_a    7.3       
cat6    time_a    5.5       
cat1    time_b    6.8       
cat2    time_b    15.0      
cat3    time_b    33.0      
cat4    time_b    4.2   
cat5    time_b    10.0      
cat6    time_b    29.5  

ggplot(data=df3, aes(x=cat, y=value, fill=variable)) +
  geom_bar(stat="identity", position=position_dodge())

enter image description here

...