我有一张看起来像这样的表
hashtag Daily_Freq men women
#a 10 6 4
#b 15 5 10
#c 20 8 12
我想绘制每个数据框线,即每个标签,男女频率。 在这种情况下,我想绘制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)
作为输出,
答案 1 :(得分:1)
一种解决方案是使用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')
选项#2
ggplot(df, aes(x=Gender, y=value)) +
geom_bar(stat='identity', position='dodge') + facet_grid(~ hashtag)
答案 2 :(得分:0)
barplot()
使用apply()
,您的表格可以转换为2x3矩阵,每个性别一行,每个唯一标签值一列。
然后,将新创建的矩阵提供给height
内的barplot()
参数。
# 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 #