2011-04-01 40 views
1

我從具有行和列名稱的文件中讀取矩陣中的數據。如何使用R繪圖函數自動將Y軸上的所有列序列與X軸上的行名進行匹配,併爲列名創建圖例。R使用行和列名稱繪製矩陣

data = read.csv(file="sample.csv",head=T,row.names=1) 
data 
      ES NQ DJ YAP FCE ESX LFT HS SNI SXF STW CGB 
19971006 981.50 NA 8171 NA 3078.0 NA 5371.0 14870 17845 NA 339.9 122.67 
19971007 989.50 NA 8232 NA 3071.0 NA 5387.0 14720 17565 NA 334.0 122.65 
19971008 989.50 NA 8160 NA 3028.0 NA 5299.0 14880 17630 NA 337.2 122.07 
19971009 978.00 NA 8124 NA 2962.0 NA 5264.0 15055 17425 NA 346.8 121.55 

# plot ES, NQ, ... series against row-names 19971006,19971007, etc 
# create legends for column series ES, NQ, etc.. 

注意,它應該能夠處理的行名19971006,19971007作爲整數和創建蜱之間適當的間隙(如1年,6個月等)。我嘗試了不同的東西,但是它變得雜亂無章,並且在繪圖時似乎沒有管理行名向量的好方法。

我應該使用不同的數據結構來表示我的數據嗎?

謝謝!

+0

使用本地繪圖功能的溶液,例如「情節/曲線'是優選的。 – user236215 2011-04-02 01:51:32

回答

2

這裏是使用重塑和GGPLOT2的溶液:

ggplot(
    melt(data.frame(date=as.Date(rownames(data), "%Y%m%d"), data), id.vars="date"), 
    aes(date, value, colour=variable)) + 
    geom_line() 
  1. 轉換rownames到日期對象並將其綁定到的原始數據幀
  2. 通過熔融
  3. 重塑寬格式數據幀,以長格式
  4. 使用ggplot2繪製它,但您可以使用其他圖形包。

而對於多面板版本,facet_wrap或facet_grid可用:

ggplot(
    melt(data.frame(date=as.Date(rownames(data), "%Y%m%d"), data), id.vars="date"), 
    aes(date, value)) + 
    geom_line() + 
    facet_wrap(~variable) + 
    opts(axis.text.x=theme_text(angle=90)) 

這裏是一個鹼圖形版本:

d <- data.frame(date=as.Date(rownames(data), "%Y%m%d"), data) 
matplot(d[,1], d[,-1], type="b", pch=1, xaxt="n") 
axis(1, d[,1], labels=d[,1]) 
+0

這是有效的。但是,它運行得有點慢,因爲我認爲它正在創建新的數據副本。如何將圖分成包含ggplot的2個圖?我試圖在運行上面的函數之前做par(mfrow = c(2,1)),但它不起作用。我需要爲兩個類似的情節提供一個單獨的圖例。 ggplot是否有靈活性來做到這一點? – user236215 2011-04-02 01:51:07

+0

答案已更新。可能最後一個接近你想要的。 – kohske 2011-04-02 02:46:56