0

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

Chris Bova
  • 134
  • 1
  • 2
  • 9

1 Answers1

1

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.

Gregor Thomas
  • 136,190
  • 20
  • 167
  • 294
  • You are absolutely correct. Can't believe I missed that. Is there a way to arrange the Topics in order of greatest value to lowest value? Something like `x=reorder(ï..Topic, -values)? – Chris Bova Apr 28 '21 at 19:45
  • Yup, something just like that. It's one of the most common ggplot questions. [Here's the related FAQ](https://stackoverflow.com/q/3253641/903061) – Gregor Thomas Apr 28 '21 at 19:58
  • 1
    within `reorder` you can specify the summary function you want - perhaps to order by the max value, the average value, the median value, etc. – Gregor Thomas Apr 28 '21 at 20:01