سؤال

أنا أستخدم RPY2-2.0.7 (أحتاج إلى العمل مع Windows 7 ، وتجميع الثنائيات لإصدارات RPY2 الأحدث هو فوضى) لدفع إطار بيانات ثنائية العمود إلى R ، وإنشاء بعض الطبقات في GGPLOT2 ، والإخراج الصورة في <.png>.

لقد أهدرت ساعات لا حصر لها من تململ مع بناء الجملة. لقد تمكنت من إخراج الملفات التي احتاجها في وقت ما ، لكن (بغباء) لم يلاحظ واستمر في التملص مع الكود الخاص بي ...

سأقدر بصدق أي مساعدة ؛ أدناه مثال (تافهة) للمظاهرة. شكرا جزيلا لك على مساعدتك!!! ~ إريك زبدة


import rpy2.robjects as rob
from rpy2.robjects import r
import rpy2.rlike.container as rlc
from array import array

r.library("grDevices")    # import r graphics package with rpy2
r.library("lattice")
r.library("ggplot2")
r.library("reshape")

picpath = 'foo.png' 

d1 = ["cat","dog","mouse"]
d2 = array('f',[1.0,2.0,3.0])

nums = rob.RVector(d2)
name = rob.StrVector(d1)

tl = rlc.TaggedList([nums, name], tags = ('nums', 'name'))
dataf = rob.RDataFrame(tl)

## r['png'](file=picpath, width=300, height=300)
## r['ggplot'](data=dataf)+r['aes_string'](x='nums')+r['geom_bar'](fill='name')+r['stat_bin'](binwidth=0.1)
r['ggplot'](data=dataf)
r['aes_string'](x='nums')
r['geom_bar'](fill='name')
r['stat_bin'](binwidth=0.1)
r['ggsave']()
## r['dev.off']()

*الإخراج هو مجرد صورة فارغة (181 ب).


فيما يلي بعض الأخطاء الشائعة R التي ترميها بينما أتجول في GGPLOT2:

r['png'](file=picpath, width=300, height=300)
r['ggplot']()
r['layer'](dataf, x=nums, fill=name, geom="bar")
r['geom_histogram']()
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

*rruntimeerror: خطأ: لا توجد طبقات في المؤامرة

r['png'](file=picpath, width=300, height=300)
r['ggplot'](data=dataf)
r['aes'](geom="bar")
r['geom_bar'](x=nums, fill=name)
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

*rruntimeerror: خطأ: متى ضبط جماليات ، قد تأخذ قيمة واحدة فقط. المشاكل: ملء ، x

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

المحلول

أستخدم RPY2 فقط من خلال الوحدة الصغيرة الرائعة لـ Nathaniel Smith rnumpy (انظر رابط "API" في الصفحة الرئيسية RNumpy). مع هذا يمكنك القيام به:

from rnumpy import *

r.library("ggplot2")

picpath = 'foo.png' 
name = ["cat","dog","mouse"]
nums = [1.0,2.0,3.0]

r["dataf"] = r.data_frame(name=name, nums=nums)
r("p <- ggplot(dataf, aes(name, nums, fill=name)) + geom_bar(stat='identity')")
r.ggsave(picpath)

(أنا أظن قليلاً عن الطريقة التي تريد أن تبدو بها المؤامرة ، لكنك تحصل على الفكرة.)

الراحة العظيمة الأخرى تتمثل في إدخال "وضع R" من Python مع وحدة IPY_RNUMPY. (انظر رابط "Ipython Integration" في الصفحة الرئيسية RNumpy).

بالنسبة للأشياء المعقدة ، عادةً ما أكون نموذجًا أوليًا في R حتى أحصل على أوامر التخطيط. يمكن أن يكون الإبلاغ عن الخطأ في RPY2 أو RNumpy فوضويًا تمامًا.

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

In [59] R> long <- 1:20
Out[59] R>
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20

In [60] R> long <- 1:100; 0
Out[60] R> [1] 0

(لإسكات بعض التحذيرات المتكررة في rnumpy ، قمت بتحرير rnumpy.py لإضافة "من تحذيرات استيراد تحذير" واستبدال "الطباعة" في Process_revents: تجاهل "" مع "WARN (" خطأ في Process_revents: تم تجاهل "). بهذه الطريقة ، أرى فقط التحذير مرة واحدة لكل جلسة.)

نصائح أخرى

يجب عليك إشراك Dev () قبل إيقاف تشغيله ، مما يعني أنه يتعين عليك طباعة () (مثل تخمينات JD أعلاه) قبل رمي Dev.off ().

from rpy2 import robjects                          
r = robjects.r                                                                                    
r.library("ggplot2")
robjects.r('p = ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()') 
r.ggsave('/stackBar.jpeg') 
robjects.r('print(p)')
r['dev.off']()

لجعل الأمر أكثر سهولة عندما تضطر إلى رسم مؤامرات أكثر تعقيدًا:

from rpy2 import robjects
from rpy2.robjects.packages import importr
import rpy2.robjects.lib.ggplot2 as ggplot2
r = robjects.r
grdevices = importr('grDevices')
p = r('''
  library(ggplot2)

  p <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
  p <- p + opts(title = "{0}")
    # add more R code if necessary e.g. p <- p + layer(..)
  p'''.format("stackbar")) 
  # you can use format to transfer variables into R
  # use var.r_repr() in case it involves a robject like a vector or data.frame
p.plot()
# grdevices.dev_off()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top