3

enter image description hereFolks, I hate to come here, asking stupid questions, and receive minuses, but this plot kills me.

I need to plot a very simple data set.

3 columns - Year, Democrats, Republicans. Year shows the year, for parties - numbers.

I swear to God, I spend several hours, trying to do it in R. Started from simple options, and go to more challenging for me.

Simple code in ggplot demonstrates an awful plot above:

ggplot(df,aes(x = Year,y = value)) + 
geom_bar(aes(fill = variable), stat = "identity", position = "dodge") 

My last attempt was melt(), but I again failed

df <- melt(platforms[,c("Year", "Democrats", "Republicans")], id.vars = 1)
ggplot(df,aes(x = Year,y = value)) + 
  geom_bar(aes(fill = variable), stat = "identity", position = "dodge") + scale_y_log10()

Error in Math.factor(x, base) : ‘log’ not meaningful for factors

I tried to change the class of it, but also failed. I googled, I tried SO - nothing.

The most killing thing, that in Excel I did in in 5 seconds. enter image description here

Please help.

UPD.

platforms <- read.csv("Platforms(f3).csv", header = TRUE)

Year <- platforms$Year
Dems <- platforms$Democrats
GOP <- platforms$Republicans


Year Democrats Republicans
1  2016    26,058      35,467
2  2012    26,558      30,563
3  2008    25,997      23,585
4  2004    17,751      41,156
5  2000    24,220      34,555
6  1996    18,107      27,817
7  1992     8,555      28,531
8  1988     4,838      35,838
9  1984    37,231      27,383
10 1980    38,180      34,558
11 1976    21,202      20,463
12 1972    25,615      24,407
13 1968    16,791      10,013
14 1964    20,126       8,740
15 1960    16,098      10,680
16 1956    12,839      11,390
17 1952     8,878       5,988
18 1948     4,256       2,739
19 1944     1,366       4,216
20 1940     4,667       3,284
21 1936     2,310       3,030
22 1932     1,489       7,832
23 1928     5,613       7,401
24 1924     5,819       5,227
25 1920     7,118       6,391
26 1916     4,570       2,377
27 1912     4,696       3,393
28 1908     4,555       4,092
29 1904     3,058       2,254
30 1900     2,580       2,299
31 1896     1,929       1,933
32 1892     2,510       1,342
33 1888     1,379       2,391
34 1884     2,695       1,538
35 1880       692       1,471
36 1876     1,867       1,363
37 1872       633       1,270
38 1868     1,422         924
39 1864       506         895
40 1860       372        1194
41 1856     2,433         952
1
  • 1
    The reason you receive downvotes is likely because you aren't posting a reproducible example. Could you post a dput(platforms) here? It's very hard to help without sample data. Commented Apr 11, 2017 at 16:13

1 Answer 1

4

Since your value column in df is a factor, you need to use as.double(as.character(df$value)). Using just as.double(df$value) will give you the numeric factor values (not what you want). However, there is some additional cleaning required since your characters will have , in them. We can gsub these out.

This should work:

df <- melt(platforms[,c("Year", "Democrats", "Republicans")], id.vars = 1)
df$value <- as.double(gsub(",","",as.character(df$value)))


ggplot(df,aes(x = Year,y = value)) + 
  geom_bar(aes(fill = variable), stat = "identity", position = "dodge") + scale_y_log10()

enter image description here

Data:

platforms <- structure(list(Year = c(2016L, 2012L, 2008L, 2004L, 2000L, 1996L, 
1992L, 1988L, 1984L, 1980L, 1976L, 1972L, 1968L, 1964L, 1960L, 
1956L, 1952L, 1948L, 1944L, 1940L, 1936L, 1932L, 1928L, 1924L, 
1920L, 1916L, 1912L, 1908L, 1904L, 1900L, 1896L, 1892L, 1888L, 
1884L, 1880L, 1876L, 1872L, 1868L, 1864L, 1860L, 1856L), Democrats = c("26,058", 
"26,558", "25,997", "17,751", "24,220", "18,107", "8,555", "4,838", 
"37,231", "38,180", "21,202", "25,615", "16,791", "20,126", "16,098", 
"12,839", "8,878", "4,256", "1,366", "4,667", "2,310", "1,489", 
"5,613", "5,819", "7,118", "4,570", "4,696", "4,555", "3,058", 
"2,580", "1,929", "2,510", "1,379", "2,695", "692", "1,867", 
"633", "1,422", "506", "372", "2,433"), Republicans = c("35,467", 
"30,563", "23,585", "41,156", "34,555", "27,817", "28,531", "35,838", 
"27,383", "34,558", "20,463", "24,407", "10,013", "8,740", "10,680", 
"11,390", "5,988", "2,739", "4,216", "3,284", "3,030", "7,832", 
"7,401", "5,227", "6,391", "2,377", "3,393", "4,092", "2,254", 
"2,2991", "1,933", "1,342", "2,391", "1,538", "1,471", "1,363", 
"1,270", "924", "895", "1194", "952")), .Names = c("Year", "Democrats", 
"Republicans"), row.names = c(NA, -41L), class = "data.frame")
Sign up to request clarification or add additional context in comments.

2 Comments

thanks a lot. My only concern now - your plot does not demonstrate the idea of data. For example, values are between 1000 and 35000, and we definitely see 1000 on a left side, but 35000 bars should be much higher. I would assume that I just need to expand limits of Y-axis.
I'm using the sample code you provided. There was a scale_y_log10() in your code which I carried over. That's something that can be easily dropped if you want

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.