У меня стол выглядит так

         hashtag  Daily_Freq men women 
          #a          10       6     4  
          #b          15       5    10   
          #c          20       8    12  

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

0
Student1000 3 Мар 2018 в 16:55

3 ответа

Лучший ответ

Одно решение использует gather и ggplot2 как:

#data
df <- read.table(text = "hashtag  Daily_Freq men women 
'#a'          10       6     4  
'#b'          15       5    10   
'#c'          20       8    12", header = T, stringsAsFactors = F)

library(tidyverse)
df <- df %>% select(-Daily_Freq) %>%
         gather(key = Gender, value, -hashtag)

library(ggplot2)
ggplot(df, aes(x=hashtag, y=value, fill=Gender)) +
geom_bar(stat='identity', position='dodge')

enter image description here

Вариант № 2

ggplot(df, aes(x=Gender, y=value)) +
  geom_bar(stat='identity', position='dodge') + facet_grid(~ hashtag)

enter image description here

1
MKR 3 Мар 2018 в 14:45

Создайте именованную матрицу перед использованием {{X0 } }

Использование apply() Ваша таблица может быть преобразована в матрицу 2x3, по одной строке на пол и одному столбцу на уникальное значение хэштега.

Затем добавьте вновь созданную матрицу в аргумент height внутри barplot().

PNG of Barchart

# load data
df <-
    read.table(
        text = "hashtag  Daily_Freq men women
                    '#a'          10       6     4
                    '#b'          15       5    10
                    '#c'          20       8    12"
        , header = TRUE
        , stringsAsFactors = FALSE
    )

# we want three barcharts
# one for unique hashtag
# and each with two columns
# one for men and one for women
gendered.frequencies.by.hashtag <-
    apply( X = df
               , MARGIN = 1
               , FUN = function( i )
                   as.numeric(
                       c( i[["women"]], i[["men"]] )
                       )
    )
# name the rows
rownames( x = gendered.frequencies.by.hashtag ) <-
    c( "women", "men" )

# name the columns
colnames( x = gendered.frequencies.by.hashtag ) <-
    unique( df$hashtag )

# create complementary color scheme
color.scheme <- c( "#18A4D2", "#D24618" )

# plot the matrix
png(
    filename = "Gendered_Freq_by_HT.png"
    , res = 300
    , units = "px"
    , height = 1600
    , width = 2800
)
barplot(
    height = gendered.frequencies.by.hashtag
    , names.arg = colnames( gendered.frequencies.by.hashtag )
    , legend.text = TRUE
    , args.legend = list(
        x = "topleft"
        , bty = "n"
    )
    , col = color.scheme
    , border = NA
    , beside = TRUE
    , las = 1
    , ylim = c( 0, max( gendered.frequencies.by.hashtag ) )
    , main = "Hashtag Frequencies by Gender"
    , ylab = "Frequency"
)
# shut down plot device
dev.off()

# end of script #
0
Cristian E. Nuno 4 Мар 2018 в 04:48

Решение, которое использует melt из reshape2, следующее:

library(ggplot2)
library(reshape2)

df <- read.table(text = "hashtag  Daily_Freq men women 
                    '#a'          10       6     4  
                    '#b'          15       5    10   
                    '#c'          20       8    12", 
                 header = TRUE)

ds <- melt(df, id.var = c("hashtag", "Daily_Freq"))

p <- ggplot(ds, aes(x=variable, y=value/Daily_Freq)) 
p <- p + geom_bar(stat='identity', 
                  position='dodge', 
                  aes(fill=hashtag)) 
p <- p + scale_colour_discrete()
p <- p + facet_grid(hashtag ~. )
show(p)

Давая в качестве выхода,

enter image description here

2
gented 3 Мар 2018 в 15:15