В настоящее время я пытаюсь создать тепловую карту в 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. Спасибо за любую помощь.
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
без отображения изображения:
.
Предотвращение немедленного закрытия отображаемого изображения может быть выполнено следующим образом:
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')
сохраняет уже отображаемое изображение в файл.