سؤال

هذا السؤال أمس حول تخزين مؤامرة ضمن كائن. حاولت تنفيذ النهج الأول (علم بأنني لم يحدد ان كنت تستخدم qplot() في سؤالي الأصلي) ولاحظت أنه لم يعمل كما هو متوقع.

library(ggplot2)               # add ggplot2

string = "C:/example.pdf"      # Setup pdf
pdf(string,height=6,width=9)

x_range <- range(1,50)         # Specify Range

# Create a list to hold the plot objects.
pltList <- list()
pltList[]

for(i in 1 : 16){

# Organise data 
y = (1:50) * i * 1000                       # Get y col
x = (1:50)                                  # get x col
y = log(y)                                  # Use natural log

# Regression
lm.0 = lm(formula = y ~ x)                  # make linear model
inter = summary(lm.0)$coefficients[1,1]     # Get intercept
slop = summary(lm.0)$coefficients[2,1]      # Get slope

# Make plot name
pltName <- paste( 'a', i, sep = '' )

# make plot object    
p <- qplot(
    x, y,   
    xlab = "Radius [km]", 
    ylab = "Services [log]",
    xlim = x_range,
    main = paste("Sample",i)
) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)        

print(p)     

pltList[[pltName]] = p       
}

# close the PDF file
dev.off() 

ولقد استخدمت أعداد العينات في هذه الحالة حتى يتم تشغيل التعليمات البرمجية إذا تم نسخها فقط. لم يمضي بضع ساعات الحيرة على هذا ولكن أنا لا يمكن معرفة ما يجري خاطئ. فإنه يكتب أول مجموعة من ملفات PDF من دون مشكلة، لذلك لدي 16 ملفات PDF مع المؤامرات الصحيحة.

وبعد ذلك عندما استخدم هذه القطعة من التعليمات البرمجية:

string = "C:/test_tabloid.pdf"
pdf(string, height = 11, width = 17)

grid.newpage()
pushViewport( viewport( layout = grid.layout(3, 3) ) )

vplayout <- function(x, y){viewport(layout.pos.row = x, layout.pos.col = y)}

counter = 1

# Page 1
for (i in 1:3){    
    for (j in 1:3){     
         pltName <- paste( 'a', counter, sep = '' )   
         print( pltList[[pltName]], vp = vplayout(i,j) )
         counter = counter + 1
     }
 }

 dev.off()

ونتيجة أحصل هو آخر خط النموذج الخطي (abline) على كل رسم بياني، ولكن لا يغير البيانات. عندما تحقق قائمتي المؤامرات، ويبدو أن كل منهم تصبح الكتابة من المؤامرة الأخيرة (باستثناء الكائن abline).

وكان سؤال الثانوي أقل أهمية كيفية إنشاء قوات الدفاع الشعبي المولى الصفحة مع العديد من المؤامرات في كل صفحة، ولكن كان الهدف الرئيسي من قانون بلدي لتخزين قطع في القائمة أن أتمكن من الوصول في وقت لاحق.

هل كانت مفيدة؟

المحلول

وطيب، حتى إذا تم تغيير القيادة مؤامرة ل

p <- qplot(data = data.frame(x = x, y = y),
           x, y,   
           xlab = "Radius [km]", 
           ylab = "Services [log]",
           xlim = x_range,
           ylim = c(0,10),
           main = paste("Sample",i)
           ) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)           

وبعد ذلك كل شيء يعمل كما هو متوقع. وإليك ما وأظن يحدث (على الرغم من هادلي ربما يمكن توضيح الأمور). عندما ggplot2 "ينقذ" البيانات، ما فعلا يفعله هو توفير إطار البيانات، وأسماء المعلمات. حتى للأمر وأنا قد أعطيت ذلك، تحصل

> summary(pltList[["a1"]])
data: x, y [50x2]
mapping:  x = x, y = y
scales:   x, y 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_point:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL)

ولكن، إذا كنت لم تحدد المعلمة data في qplot، كل المتغيرات الحصول على تقييمها في النطاق الحالي، لأنه لا يوجد المرفقة (قراءة: حفظ) إطار البيانات.

data: [0x0]
mapping:  x = x, y = y
scales:   x, y 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_point:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL)

وهكذا عندما يتم إنشاء المؤامرة في المرة الثانية، بدلا من استخدام القيم الأصلية، فإنه يستخدم <م> الحالي قيم x وy.

نصائح أخرى

وأعتقد أن عليك أن استخدام الوسيطة data في qplot، أي تخزين ناقلات الخاص في إطار البيانات.

وانظر كتاب هادلي، القسم 4.4:

القيد على البيانات بسيط: يجب أن يكون إطار البيانات. هذا التقييد، وعلى عكس حزم الرسومات الأخرى في وظائف R. شعرية يمكن أن تتخذ إطار بيانات اختيارية أو استخدام ناقلات مباشرة من البيئة العالمية. ...

يتم تخزين البيانات في وجوه المؤامرة نسخة، وليس مرجعا. هذا وقد اثنين نتائج مهمة: إذا تغير البيانات الخاصة بك، والمؤامرة سوف لا. والأشياء ggplot2 هي تماما بذاتها بحيث يمكن حفظ () د إلى القرص وتحميل لاحق () إد وتآمر دون الحاجة إلى أي شيء آخر من تلك الدورة.

وهناك خلل في التعليمات البرمجية المتعلقة subscripting القائمة. وينبغي أن يكون

pltList[[pltName]]

وليس

pltList[pltName]

ملاحظة:

class(pltList[1])
[1] "list"

وpltList [1] هو قائمة تحتوي على العنصر الأول من pltList.

class(pltList[[1]])
[1] "ggplot"

وpltList [[1]] هو الأول <م> العنصر من pltList.

لسؤالك الثاني: ملفات PDF متعدد الصفحات من السهل - راجع help(pdf):

 onefile: logical: if true (the default) allow multiple figures in one
          file.  If false, generate a file with name containing the
          page number for each page.  Defaults to ‘TRUE’.

وبالنسبة للسؤال الرئيسي الخاص بك، وأنا لا أفهم إذا كنت تريد تخزين <م> المدخلات المؤامرة في قائمة لمعالجة لاحق، أو <م> مخرجات المؤامرة . إذا كان هذا هو الأخير، وأنا لست متأكدا من أن plot() بإرجاع كائن يمكنك تخزين واسترجاع.

واقتراح آخر بشأن سؤالك الثاني سيكون لاستخدام إما Sweave أو المشروب لأنها سوف تعطيك سيطرة كاملة على كيفية عرض الخاص بك الشعبي متعدد الصفحات.

وإلقاء نظرة في هذه المسألة المتعلقة .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top