2015-06-25 3 views
1

В настоящее время я пытаюсь создать тепловую карту в python из текстового файла, используя команды R (с rpy2). Он отлично работает в R, но когда я беру его на python, интерфейс Quartz отображается быстро, а затем закрывается. Я хотел бы либо иметь возможность сохранять кварцевый дисплей в файле, либо напрямую сохранять мою тепловую карту в файл, не отображая ее.Как отобразить тепловую карту, созданную в python, с помощью rpy2?

Вот код, я использую:

import rpy2.robjects as robjects 

robjects.r(''' 
library("gplots") 
data = read.csv("/Users/.../Heatmap_data.txt") 
DF = data.frame(data) 
MD = data.matrix(DF,rownames.force=NA) 
heatmap.2(MD, scale="none", col=redgreen(100), cexRow=0.1, key=FALSE, symkey=FALSE, trace="none", Colv=FALSE) 
''') 

Я использую Python 2.7 на OS X Yosemite. Благодарим вас за помощь.

ответ

1
import numpy as np 
import rpy2.robjects as ro 
import rpy2.robjects.numpy2ri 
ro.numpy2ri.activate() 
R = ro.r 

data = np.random.random((10, 10)) 
R.png(file='/tmp/out.png') 
R.heatmap(data) 
R("dev.off()") 

writes to the file/tmp/out.png без отображения изображения:

enter image description here.


Preventing the displayed image from immediately closing можно сделать так:

script.py:

import numpy as np 
import rpy2.robjects as ro 
import rpy2.robjects.numpy2ri 
import rpy2.rinterface as rinterface 
import time 
import threading 

ro.numpy2ri.activate() 
R = ro.r 

def ion(): 
    def r_refresh(interval = 0.03): 
     while True: 
      rinterface.process_revents() 
      time.sleep(interval) 
    t = threading.Thread(target=r_refresh) 
    t.daemon = True 
    t.start() 

ion() 
data = np.random.random((10, 10)) 
R.heatmap(data) 

R("dev.copy(png,'/tmp/out2.png')") 
R("dev.off()") 
try: 
    # for Python2 
    raw_input() 
except NameError: 
    # for Python3 
    input() 

raw_input или input вызов не мешает интерпретатор Python от выхода, что позволяет окно оставаться открытым, пока пользователь нажимает Enter.

Функция ioncalls rinterface.process_revents() periodically, так что отображаемое окно будет реагировать на события GUI, такие как изменение размера или закрытие.

dev.copy(png,'/tmp/out2.png')saves the already-displayed image to a file.

+0

Да, это действительно работает. Большое спасибо! – Daniel

Смежные вопросы