2011-01-10 7 views
5

मेरे पास तीन साल में गैस मीटर रीडिंग है जो मैं आर में ग्राफ करने की कोशिश कर रहा हूं, एक वर्ष में महीनों में बदलते दैनिक उपयोग को हाइलाइट करने और विभिन्न वर्षों के उपयोग की तुलना करने के लिए।एक ही प्लॉट पर एक ही फाइल से कई वर्षों के वाई-अक्ष डेटा कैसे प्राप्त करें?

डाटा नमूना:

Date,Gas 
02/01/2010,4460.9 
13/01/2010,4543 
04/02/2010,4656 
16/02/2010,4733 
07/03/2010,4842 
26/03/2010,4933.8 

मैं समय-समय पर रीडिंग से औसत दैनिक उपयोग की गणना कर सकते हैं, और एक ही डेटा श्रृंखला के रूप में कई वर्षों में डेटा के पूरे साजिश:

A <- read.table("energy.csv", header=TRUE, fill=TRUE, sep=',') 
A$Dates <- as.Date(A$Date, format="%d/%m/%Y") 
for (j in 2:length(A$Gas)) { 
    A$GasDiff[j-1] = A$Gas[j] - A$Gas[j-1] 
} 
plot(A$Dates, A$GasDiff, type="o", lty=1, pch=20, ylab="Daily Consumption", 
    main="Gas Consumption") 

लेकिन मैं डेटा को स्वचालित रूप से अलग-अलग विभाजित करने के लिए आर कैसे प्राप्त कर सकता हूं? फ्रेम? प्रत्येक वर्ष के लिए, ताकि मैं प्रत्येक वर्ष के लिए अलग लाइनों का साजिश कर सकूं। मैं मैन्युअल रूप से प्रत्येक वर्ष के लिए डेटा के साथ अलग-अलग इनपुट फाइलें बना सकता हूं, लेकिन यह सुरुचिपूर्ण है, और प्रत्येक वर्ष कोड बदलना होगा।

मुझे यकीन है कि यह एक साधारण सवाल है, लेकिन मैंने मैनुअल पर देखा है, और इसे समझ नहीं सकता है।

उत्तर

13

डेटा को डेटा-फ्रेम में वर्ष में विभाजित करने की आवश्यकता नहीं है; आप वर्ष के अनुसार भूखंडों को अलग करने के लिए ggplot2 पैकेज का उपयोग आसानी से कर सकते हैं।

dts <- as.Date("20050101", '%Y%m%d') + seq(0,1000,15) 
A <- data.frame(Dates = dts, Gas = 4000 + cumsum(abs(rnorm(length(dts), 100, 30)))) 

अगला मैं A करने के लिए दो कॉलम जोड़ देंगे:: सबसे पहले मैं कुछ डेटा को बनाती हूँ तुम्हारा के रूप में DayOfYear जो "दिन-संख्या" वर्ष के भीतर है, और GasDiff स्तंभ (समान लेकिन उत्पन्न अधिक आसानी से, कोई छोरों) के साथ:

A <- transform(A,    
       Year = format(Dates, '%Y'), 
       DayOfYear = as.numeric(format(Dates, '%j')), 
       GasDiff = c(diff(Gas),NA)) 

अगला हम ggplot2 पहले साजिश करने के लिए एक के बाद एक का उपयोग सभी वर्षों है, लेकिन अलग अलग रंग के साथ:

require(ggplot2) 
ggplot(A, aes(Dates, GasDiff)) + geom_line(aes(colour = Year)) 

जो आप देता है यह: alt text

वैकल्पिक रूप से आप एक ऊर्ध्वाधर ग्रिड में अलग-अलग वर्षों प्लॉट कर सकते हैं:

ggplot(A, aes(DayOfYear, GasDiff)) + geom_line() + facet_grid(Year ~ .) 

और आप इस मिल: alt text

अद्यतन: एक तीसरा तरीका सभी सालों को अलग-अलग रंगों/बिंदुओं के साथ एक ही साजिश पर साजिश करना है, जो उपयोगी हो सकता है यदि आप मौसमी पैटर्न की तलाश में हैं (लेकिन मेरे मामले में बुरा लगता है क्योंकि मैंने यादृच्छिक डेटा बनाया है)।

ggplot(A, aes(DayOfYear, GasDiff)) + 
    geom_line(aes(colour = Year)) + 
    geom_point(aes(shape = Year)) 

alt text

+0

कोशिश ggsave(), ggsave ("/ tmp/image.png", के रूप में चौड़ाई = 5, ऊंचाई = 4, डीपीआई = 72) - मैं पीडीएफ, कनवर्टिंग, अपलोडिंग इत्यादि के रूप में सहेजने के बजाय अपने मैक पर हर समय इसका उपयोग करता हूं। –

+0

@ जेफरी आह हां बिल्कुल, ऐसा करने का तरीका है, इसे इंगित करने के लिए धन्यवाद! –

+0

@ प्रसाद - यह तेज़ और बहुत उपयोगी था, जो मुझे बाद में दे रहा था। – jgc

6

यहाँ प्रसाद के ggplot उदाहरण के लिए इसी भूखंडों (1) किया जाली में xyplot का उपयोग कर रहे हैं। (2) इसके बाद हम दिखाते हैं कि चिड़ियाघर पैकेज से xyplot.zoo का उपयोग करके इसे कैसे करें और फिर (3) हम दिखाते हैं कि plot.zoo का उपयोग करके प्रत्येक को फिर से कैसे करना है जो चिड़ियाघर पैकेज की क्लासिक ग्राफिक्स सुविधाओं का उपयोग करता है।

इन मामलों में से प्रत्येक में हम एक चौथी शैली भी दिखाते हैं जो xblocks पर आधारित है।

सबसे पहले प्रसाद के सेटअप को दोहराने कर सकते हैं:

alt text

और अब का उपयोग कर इस दोहराने कर सकते हैं:

dts <- as.Date("20050101", '%Y%m%d') + seq(0,1000,15) 
A <- data.frame(Dates = dts, Gas = 4000 + cumsum(abs(rnorm(length(dts), 100, 30)))) 

A <- transform(A,    
       Year = format(Dates, '%Y'), 
       DayOfYear = as.numeric(format(Dates, '%j')), 
       GasDiff = c(diff(Gas),NA)) 

अब जाली का उपयोग कर

library(lattice) # xyplot 
library(latticeExtra) # layer_, panel.xblocks 
library(gridExtra) # grid.arrange 
library(RColorBrewer) # brewer.pal 

png("png1.png") 
p1 <- xyplot(GasDiff ~ Dates, group = Year, A, type = "l", 
    par.settings = list(superpose.line = list(col = 1:nlevels(A$Year))), 
    auto.key = list(lines = TRUE, points = FALSE)) 

p2 <- xyplot(GasDiff ~ DayOfYear | Year, A, type = "l", layout = c(1, 3)) 

p3 <- xyplot(GasDiff ~ DayOfYear, A, group = Year, type = "l", 
    auto.key = list(lines = TRUE, points = FALSE)) 

# and here is another style: 

myPalette <- brewer.pal(nlevels(A$Year), "Set3") 
p4 <- xyplot(GasDiff ~ Dates, A, type = "l", col = 1) + 
    layer_(panel.xblocks(A$Dates, myPalette[A$Year])) 

grid.arrange(nrow = 2, p1, p2, p3, p4) 
dev.off() 

यह इन 4 भूखंडों देता है की कोशिश की सुविधा देता है जाली और दूसरे पी के साथ संयोजन में चिड़ियाघर का उपयोग कर ackages:

:

alt text

तरीकों में से एक तिहाई सेट चिड़ियाघर के साथ क्लासिक ग्राफिक्स जहां हम एक ही z, zz और pal ऊपर गणना का उपयोग का उपयोग करने के लिए है:

png("png2.png") 
library(zoo) 
library(lattice) 
library(latticeExtra) # layer_, panel.xblocks 
library(gridExtra) # grid.arrange 
library(RColorBrewer) # brewer.pal 

z <- with(A, zoo(GasDiff, Dates)) 
year <- format(time(z), "%Y") 

# split years into separate columns and plot 
P1 <- xyplot(do.call("merge", split(z, year)), screen = 1, col = 1:3) 

# split years into separate columns and use day.of.year as time 
day.of.year <- function(x) as.numeric(format(x, "%j")) 
zz <- read.zoo(A[c(1, 5, 3)], FUN = day.of.year, split = 3) 
colnames(zz) <- unique(year) 
P2 <- xyplot(na.approx(zz, na.rm = FALSE)) 

P3 <- xyplot(na.approx(zz, na.rm = FALSE), screen = 1, col = 1:3, auto.key = TRUE) 

pal <- brewer.pal(nlevels(factor(year)), "Set3") 
P4 <- xyplot(z, screen = 1) + layer_(panel.xblocks(time(z), pal[factor(year)])) 

grid.arrange(nrow = 2, P1, P2, P3, P4) 
dev.off() 

यहाँ उत्पादन होता है

library(zoo) 
library(RColorBrewer) # brewer.pal 

png("png3a.png") 
plot(do.call("merge", split(z, year)), screen = 1, col = 1:3) 
dev.off() 
png("png3b.png") 
plot(na.approx(zz, na.rm = FALSE)) 
dev.off() 
png("png3c.png") 
plot(na.approx(zz, na.rm = FALSE), screen = 1, col = 1:3) 
legend("topleft", colnames(zz), lty = 1, col = 1:3, bty = "n") 
dev.off() 
png("png3d.png") 
plot(z, type = "n") 
xblocks(time(z), pal[factor(year)]) 
lines(z) 
dev.off() 

और यहां आउटपुट

है

alt text

alt text

alt text

alt text

+0

धन्यवाद, @ जीजी, मेरे चार्टिंग आउटपुट को बेहतर बनाने के कई नए तरीके हैं। अचानक जाली आदि इतनी मुश्किल लगती नहीं है। – jgc

+0

+1 वाह कई प्लॉटिंग विधि का अच्छा चित्रण! –

+0

जी, उपरोक्त na.approx (zz) na.approx (zz, na.rm = गलत) होना चाहिए? –

संबंधित मुद्दे