Построить несколько линий на одном графике

попытка использовать ggplot для построения нескольких строк в один график, но не уверен, как это сделать с моим набором данных. Не уверен, Нужно ли мне менять структуру данных или нет (транспонировать?)

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

Company   2011   2013
Company1  300    350
Company2  320    430
Company3  310    420

Я также попробовал его транспонировать:

Year   Company1  Company2  Company3
2011   300       320       310 
2013   350       430       420

и для этого я могу построить 1 из значений, используя;

ggplot(data=df, aes(x=Year, y=Company1)) + geom_line(colour="red") + geom_point(colour="red", size=4, shape=21, fill="white")

но я не знаю, как объединить все компании, поскольку у меня больше нет объекта "компания" для группировки. Любой предложения?

3 ответов


вы должны привести свои данные в длинный (т. е. расплавленный) формат, чтобы использовать его с ggplot2:

library("reshape2")
mdf <- melt(mdf, id.vars="Company", value.name="value", variable.name="Year")

и тогда вы должны использовать aes( ... , group = Company ) сгруппировать их:

ggplot(data=mdf, aes(x=Year, y=value, group = Company, colour = Company)) +
    geom_line() +
    geom_point( size=4, shape=21, fill="white")

enter image description here


вместо использования возмутительно запутанных структур данных, требуемых ggplot2, вы можете использовать собственные функции R:

tab<-read.delim(text="
Company 2011 2013
Company1 300 350
Company2 320 430
Company3 310 420
",as.is=TRUE,sep=" ",row.names=1)

tab<-t(tab)

plot(tab[,1],type="b",ylim=c(min(tab),max(tab)),col="red",lty=1,ylab="Value",lwd=2,xlab="Year",xaxt="n")
lines(tab[,2],type="b",col="black",lty=2,lwd=2)
lines(tab[,3],type="b",col="blue",lty=3,lwd=2)
grid()
legend("topleft",legend=colnames(tab),lty=c(1,2,3),col=c("red","black","blue"),bg="white",lwd=2)
axis(1,at=c(1:nrow(tab)),labels=rownames(tab))

R multiple lines plot


ответ @Federico Giorgi был очень хорошим ответом. Он помог мне. Поэтому я сделал следующее: чтобы создать несколько строк на одном графике из данных одного набора данных, я использовал цикл for. Легенда также может быть добавлена.

plot(tab[,1],type="b",col="red",lty=1,lwd=2, ylim=c( min( tab, na.rm=T ),max( tab, na.rm=T ) )  )
for( i in 1:length( tab )) { [enter image description here][1]
lines(tab[,i],type="b",col=i,lty=1,lwd=2)
  } 
axis(1,at=c(1:nrow(tab)),labels=rownames(tab))