Search code examples
rggplot2bar-chartreshape2

Grouped barplot using ggplot from frequency table data


I have a frequency table that I would like to do a grouped barplot with. The topics of interest (ie. hunting, fishing) would be on the x axis, the values of these items would be on the y-axis, and they would be grouped by age group.

heres the data:

structure(list(ï..Topic = c("Hunting", "Game Lands", "Boating", 
"Fishing", "Bird watching", "Wildlife Viewing (other than bird watching)", 
"Research Reports", "Law Enforcement", "NCWRC Rules and Regulations", 
"Human Wildlife Interactions", "Trapping", "Learning & Education Opportunities", 
"Agency Events", "Commissioner and Agency Staff Profiles & Awards", 
"Citizen Science Opportunities", "Volunteer Opportunities", "Private Land Management", 
"Shooting Sports", "Archery", "Wildlife Associated Recreation (Photography, hiking, botany)", 
"Conservation", "Species Information", "Diversity, Equality, and Inclusivity", 
"Youth Opportunities", "Philanthropy", "Wildlife Facilities (hatcheries, education centers, etc)", 
"Other"), X18.24 = c("12.35", " 9.88", " 4.94", "12.35", " 0.00", 
" 2.22", " 4.44", " 3.95", " 8.15", " 1.23", " 1.23", " 0.99", 
" 0.00", " 0.00", " 1.23", " 2.22", " 5.19", " 4.69", " 1.98", 
" 3.70", " 5.93", " 6.91", " 0.00", " 0.99", " 0.00", " 5.43", 
" 0.00"), X25.34 = c(" 6.96", "10.17", " 5.18", " 7.90", " 1.47", 
" 1.70", " 5.18", " 2.19", " 7.32", " 0.89", " 2.32", " 3.21", 
" 1.20", " 0.13", " 2.41", " 2.54", " 5.18", " 3.66", " 3.61", 
" 3.79", " 6.78", " 7.05", " 0.49", " 2.54", " 0.18", " 5.27", 
" 0.54"), X35.54 = c("8.92", "8.04", "5.86", "9.75", "1.44", 
"2.73", "2.99", "2.85", "7.52", "2.43", "2.54", "2.84", "1.13", 
"0.26", "1.38", "2.37", "4.22", "5.05", "3.71", "3.60", "5.14", 
"5.72", "0.33", "3.84", "0.27", "4.78", "0.32"), X55.64 = c("7.88", 
"7.29", "6.26", "9.82", "2.36", "3.18", "3.46", "3.64", "8.29", 
"2.97", "1.66", "3.02", "1.23", "0.18", "1.32", "3.00", "3.67", 
"5.46", "2.87", "3.31", "4.23", "6.86", "0.49", "1.94", "0.19", 
"5.10", "0.34"), X65.or.older = c(" 7.58", " 5.72", " 6.68", 
"10.32", " 3.23", " 4.59", " 3.43", " 3.50", " 8.78", " 3.85", 
" 1.13", " 2.92", " 1.05", " 0.35", " 1.16", " 2.40", " 2.61", 
" 4.80", " 1.75", " 4.29", " 4.48", " 7.14", " 0.45", " 1.67", 
" 0.25", " 5.50", " 0.41"), Prefer.not.to.share = c("5.74", "6.01", 
"6.28", "7.79", "1.09", "7.92", "2.60", "3.83", "6.69", "3.28", 
"3.96", "1.23", "1.64", "0.00", "0.00", "2.87", "6.01", "3.42", 
"2.05", "5.74", "4.51", "5.05", "0.00", "2.32", "0.68", "6.28", 
"2.19")), class = "data.frame", row.names = c(NA, -27L))

I tried to change the format using : library(reshape2) ages<- melt(age.table[,c("ï..Topic",'X18.24','X25.34','X35.54', 'X55.64', "X65.or.older")],id.vars = 1) * I dont really need the "prefer not to answer" responses here.

Then plot using

library(ggplot2)
b<-ggplot(ages, aes(x=ï..Topic, y=value, fill = variable)) + geom_bar(stat="identity", position= "dodge")+ coord_flip() +scale_fill_brewer(palette = "Paired")

I get a plot, but the values dont line up with the values in the original table. Also, how can I prevent it from rearranging the order of the age groups and keep it consistent for each topic (ie. ascending from lowest ages category to highest, rather than ordering based on value) see table below

Attempted plot with strange values


Solution

  • Your issue is that none of your data is numeric - "12.35" with quotes, is a string. 12.35 without quotes is a number. You need to convert your numeric columns to numeric class. age.table <- type.convert(age.table) should do a pretty good job.