Воспроизвести линейный график в matplotlib или R
Я наткнулся на замечательную фигуру, которая суммирует (научное) сотрудничество авторов за годы. Фигура наклеена ниже.
Каждая вертикальная линия относится к одному автору. Начало каждой вертикальной линии соответствует году, в течение которого соответствующий автор получил своего первого сотрудника (то есть, когда он стал активным и, таким образом, частью сети сотрудничества). Авторы ранжируются по общему количеству соавторов за последний год (т. Е. В 2010 году). Раскраска обозначает, как количество соавторов каждого автора увеличивалось с годами (с момента начала деятельности до 2010 года).
У меня есть похожий набор данных; вместо авторов у меня есть ключевые слова в моем наборе данных. Каждое числовое значение обозначает частоту срока в конкретном году. Данные выглядят так:
Year Term1 Term2 Term3 Term4
1966 0 1 1 4
1967 1 5 0 0
1968 2 1 0 5
1969 5 0 0 2
Например, Term2
впервые происходит в 1967 году с частотой 1, а Term4
впервые происходит в 1966 году с частотой 4. Полный набор данных доступен здесь.
1 ответ
График выглядит довольно красиво, поэтому я попытался воспроизвести его. Оказывается, это немного сложнее, чем я думал.
df=read.table("test_data.txt",header=T,sep=",")
#turn O into NA until >0 then keep values
df2=data.frame(Year=df$Year,sapply(df[,!colnames(df)=="Year"],function(x) ifelse(cumsum(x)==0,NA,x)))
#turn dataframe to a long format
library(reshape)
molten=melt(df2,id.vars = "Year")
#Create a new value to measure the increase over time: I used a log scale to avoid a few classes overshadowing the others.
#The "increase" is measured as the cumsum, ave() is used to get cumsum to work with NA's and tapply to group on "variable"
molten$inc=log(Reduce(c,tapply(molten$value,molten$variable,function(x) ave(x,is.na(x),FUN=cumsum)))+1)
#reordering of variable according to max increase
#this dataframe is sorted in descending order according to the maximum increase"
library(dplyr)
df_order=molten%>%group_by(variable)%>%summarise(max_inc=max(na.omit(inc)))%>%arrange(desc(max_inc))
#this allows to change the levels of variable so that variable is ranked in the plot according to the highest value of "increase"
molten$variable<-factor(molten$variable,levels=df_order$variable)
#plot
ggplot(molten)+
theme_void()+ #removes axes, background, etc...
geom_line(aes(x=variable,y=Year,colour=inc),size=2)+
theme(axis.text.y = element_text())+
scale_color_gradientn(colours=c("red","green","blue"),na.value = "white")# set the colour gradient
Не так хорошо, как в газете, но это только начало.