Как отобразить тепловую карту, созданную в python, используя rpy2?

2

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

Вот код, который я использовал:

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. Спасибо за любую помощь.

Теги:
quartz-graphics
rpy2

1 ответ

2
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()")

записывает в файл /tmp/out.png без отображения изображения:

Изображение 174551.


Предотвращение немедленного закрытия отображаемого изображения может быть выполнено следующим образом:

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.

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

dev.copy(png,'/tmp/out2.png') сохраняет уже отображаемое изображение в файл.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню