按R中的数据帧的线条绘制

时间:2018-03-03 13:55:46

标签: r dataframe bar-chart lines

我有一张看起来像这样的表

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

我想绘制每个数据框线,即每个标签,男女频率。 在这种情况下,我想绘制3个条形图,每个条形图有两列 - 一个用于男性,另一个用于女性频率。 我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

一种解决方案是使用gatherggplot2作为:

#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

答案 2 :(得分:0)

在使用barplot()

之前创建命名矩阵

使用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 #