2016-11-09 2 views
0

Ich stieß auf wunderbare figure, die (wissenschaftliche) Autoren Zusammenarbeit über Jahre zusammenfasst. Die Figur ist unten eingefügt.Reproduzieren Liniendiagramm in Matplotlib oder R

enter image description here

Jede vertikale Linie bezieht sich auf einzelnen Autor. Der Beginn jeder vertikalen Linie entspricht dem Jahr, in dem der betreffende Autor seine erste Mitarbeiterin erhielt (d. H. Als sie aktiv wurde und somit Teil des Kollaborationsnetzwerks war). Autoren werden nach der Gesamtzahl ihrer Mitarbeiter im letzten Jahr (d. H. 2010) eingestuft. Die Farbgebung gibt an, wie die Anzahl der Mitarbeiter eines jeden Autors im Laufe der Jahre zugenommen hat (seit dem Zeitpunkt der Aktivierung bis 2010).

Ich habe einen ähnlichen Datensatz; anstelle von Autoren habe ich Keywords in meinem Datensatz. Jeder Zahlenwert bezeichnet die Häufigkeit des Begriffs in einem bestimmten Jahr. Die Daten wie folgt aussehen:

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 

Zum Beispiel Term2 erstmals im Jahr 1967 mit der Frequenz 1 auftritt, während Term4 zunächst mit der Frequenz im Jahr 1966 treten 4. Die vollständige Datensatz here zur Verfügung steht.

+1

Dies ist nicht sehr schwierig. Zeige deine eigenen Bemühungen und erkläre, wo du feststeckst. – Roland

+1

Da Sie natürliche Bins (Autor ID und Jahr) haben, würde ich dies mit einer Heatmap/IMshow tun. Füllen Sie es mit 'np.nan' aus, um mit zu beginnen, und füllen Sie dann Werte mit ganzen Zahlen (unklar, wie es Bruchteilhaber gibt). Dann verwenden Sie einfach "ax.imshow" für den Hintergrund + "ax.plot" für diese über die geplottete Linie. – tacaswell

Antwort

2

Die Grafik sieht ziemlich gut aus, also habe ich versucht, sie zu reproduzieren. Stellt sich heraus, es ist ein bisschen komplizierter als ich dachte.

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 

Gibt: enter image description here

Nicht so schön wie in dem Papier, aber das ist ein Anfang.

Verwandte Themen