2015-12-12 11 views
-1

Вдохновленный this вопрос, я хотел бы создать участок 100% сложенной площади с ggplot2 показ фильмов по годам, заказанным по стране. Мой кадр данных можно получить here. У меня две переменные year и country. Я знаю, если есть ошибка в мышлении, но я не могу получить решение.100% уложенная площадь участка в ggplot2

код я использую:

library(reshape) 
library(ggplot2) 

df <- read.csv(url("https://dl.dropboxusercontent.com/u/109495328/movie_db.csv")) 
ggplot(df, aes(x=Year,y=Country,group=Country,fill=Country)) + geom_area(position="fill") 

Мой график выглядит следующим образом:

enter image description here

Но должен выглядеть как-то так (например, сюжет):

enter image description here

Что я Иссингом?

Edit:

лесоруб, я не понимаю, как вы получите ваш Freq переменную, даже с обновленным решением?

Я не уверен, что это необходимо, или если ggplot делает это «automaticcaly», но я думаю, что фактическая проблема, которую я имею, заключается в том, чтобы преобразовать свой фрейм данных выше в информационный кадр, понимает, как часто страна появляется каждый год и сохраняет ее частота:

От:

year country 
2015 US 
2015 US 
2014 UK 
2015 UK 
2014 US 
. 
. 
. 

To:

year country freq 
2015 US  6 
2015 UK  7 
2014 US  10 
2014 UK  2 
+1

Вы пропустили хорошее объяснение того, что ваш граф должен показать. Ваш пример имеет непрерывную ось y, ваш код имеет коэффициент y. Также проверьте 'range (df $ Year)'. – Axeman

+1

Использует ли 'stat =" identity "' и 'position =" stack "' in 'geom_area' help? См. [Здесь для примера] (http://stackoverflow.com/questions/22945651/how-to-remove-space-between-axis-area-plot-in-ggplot2) – Jaap

+0

@ Яап, он не работает. Он похож на графический вывод, как показано выше. @ Axeman, я хотел бы показать, сколько фильмов в базе данных по годам по сравнению со странами, в которых они были произведены. У меня такое ощущение, что я должен добавить третью переменную, показывающую только «1» в каждой строке. Axeman, что вы предлагаете? –

ответ

1

Еще немного не уверены, что вы хотите, но вот моя попытка:

#load some libraries 
library(dplyr) 
library(tidyr) 

#get rid of some clear errors in your supplied data 
df <- filter(df, Country != '') 
df <- droplevels(df) 

#now pre-calculate the proportion for each country each year summing up to one. 
#note that it may be more useful to have actual counts here instead of 0 or 1. 
df2 <- table(Year = df$Year, Country = df$Country) %>% prop.table(1) %>% as.data.frame() 
#fix year into a numeric 
df2$Year <- as.numeric(as.character(df2$Year)) 

#make the plot 
ggplot(df2, aes(x=Year,y=Freq,group=Country,fill=Country)) + 
    geom_area(alpha = 1) + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

enter image description here

Если вы не хотите, чтобы подвести к одному, используйте вместо этого:

df3 <- table(Year = df$Year, Country = df$Country) %>% as.data.frame() 
#fix year into a numeric 
df3$Year <- as.numeric(as.character(df3$Year)) 

#make the plot 
ggplot(df3, aes(x=Year,y=Freq,group=Country,fill=Country)) + 
    geom_area(alpha = 1) + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

enter image description here

+0

Axeman, большое спасибо за вашу попытку! Мы очень близки! Я нашел свою ошибку: это не участок на 100% площади, а «просто» участок (я соответствующим образом скорректировал заголовок). Предположим, что y ax отображает сумму фильмов каждый год. Например, все фильмы в 2015 году, предположим, 100, должны быть показаны там. В 2014 году, однако, их всего 50. Значит, 50 должно быть указано на 2014 год. Я думал, что 'ggplot' получает номер, т.е. е.100 на 2015 год и 50 на 2014 год, прочитав, сколько раз 2015 появляется в кадре данных и сохраняет это в переменной, которую вы назвали «Freq». Как я могу это достичь? –

+0

Правильно, извините, ваш пример изображения меня отбросил. Я думаю, вы хотите использовать эту строку вместо: 'df2 <- table (Year = df $ Year, Country = df $ Country)%>% as.data.frame()' (без 'prop.table'). – Axeman

+0

Axeman, большое спасибо за ваш ответ. Пожалуйста, обратите внимание на мое редактирование выше. –