2016-11-09 9 views
0

Я наткнулся на замечательный figure, который обобщает (научное) сотрудничество авторов в течение многих лет. Рисунок будет вставлен ниже.Воспроизводить линейный график в matplotlib или R

enter image description here

Каждая вертикальная линия относится к одному автору. Начало каждой вертикальной линии соответствует году, когда соответствующий автор получил своего первого сотрудника (т. Е. Когда она стала активной и, следовательно, стала частью сети сотрудничества). Авторы оцениваются в соответствии с общим количеством сотрудников, которых они имели за последний год (т. Е. В 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. Полный набор данных доступен here.

+1

Это не очень сложно. Покажите свои собственные усилия и объясните, где вы застряли. – Roland

+1

Поскольку у вас есть натуральные бункеры (авторский идентификатор и год), я бы сделал это с помощью тепловой карты/imshow. Заполните его с помощью 'np.nan' для начала, а затем заполните значения целыми числами (неясно, как существуют дробные соавторы). Затем просто используйте 'ax.imshow' для фона +' ax.plot' для этой надстрочной линии. – tacaswell

ответ

2

График выглядит довольно красиво, поэтому я попытался воспроизвести его. Оказывается, это немного сложнее, чем я думал.

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 

Дает: enter image description here

Не так хорошо, как в работе, но это начало.