Дендрограмма, генерируемая scipy-кластером, не отображается - PullRequest
13 голосов
/ 03 июня 2010

Я использую scipy-cluster для генерации иерархической кластеризации на некоторых данных. На последнем этапе применения я вызываю функцию dendrogram для построения кластеризации. Я работаю на Mac OS X Snow Leopard, используя встроенный Python 2.6.1 и этот пакет matplotlib . Программа работает нормально, но в конце появляется значок Rocket Ship (насколько я понимаю, это пусковая установка для приложений с графическим интерфейсом на python) и сразу же исчезает, ничего не делая. Ничего не показано. Если я добавлю raw_input после вызова, он просто подпрыгнет вверх и вниз в доке навсегда. Если я запускаю простой пример приложения для matplotlib из терминала, он работает нормально. У кого-нибудь есть опыт по этому поводу?

Ответы [ 2 ]

16 голосов
/ 28 сентября 2010

У меня была такая же проблема в Ubuntu 10.04. Чтобы графика отображалась с интерактивной консоли ipython, запустите ее с ключом -pylab, который позволяет интерактивно использовать matplotlib:

ipython -pylab

Чтобы ваша графика отображалась во время выполнения отдельного скрипта, используйте вызов matplotlib.pyplot.show. Вот пример с домашней страницы hcluster, здесь первая и последняя строки являются значащими битами:

from matplotlib.pyplot import show

from hcluster import pdist, linkage, dendrogram
import numpy
from numpy.random import rand

X = rand(10,100)
X[0:5,:] *= 2
Y = pdist(X)
Z = linkage(Y)
dendrogram(Z)

show()
4 голосов
/ 20 января 2012

Вызов ipython с ключом -pylab для меня не имел значения. (Система: Fedora 13)

Хотя это и не идеальное решение, я решил явно записать полученную фигуру в виде файла. Например:

...
dendrogram(Z)
pylab.savefig( "temp.png" )

Надеюсь, это поможет всем, кто сталкивается с той же проблемой.

Поправка: будьте осторожны с простым использованием копирования и вставки с кратким руководством по пакету hcluster, особенно в том случае, если вы вызываете pylab.savefig () после нескольких типов рисования дендрограмм, показанных в руководстве, то есть

distMat = # whatever distance matrix you have
dendrogram( linkage( distMat ) )
pylab.savefig( "exampleDendrogram.png" )
dendrogram( linkage( distMat, method="complete" ) ) #instead of default "single"
pylab.savefig( "exampleDendrogram.png" )

Тогда exampleDendrogram.png будет содержать как дендрограмму с одной связью, так и дендрограмму полной связи на одном и том же рисунке, и они, вероятно, будут пересекаться и выглядеть как беспорядок.

Если вы так же глупы, как и я, вы потратите 30-180 минут в замешательстве по поводу того, как правильно использовать hcluster, когда на самом деле это просто вопрос сброса matplotlib между вызовами дендрограммы:

distMat = # whatever distance matrix you have
dendrogram( linkage( distMat ) )
pylab.savefig( "exampleDendrogram1.png" )
pylab.cla()
dendrogram( linkage( distMat, method="complete" ) ) #instead of default "single"
pylab.savefig( "exampleDendrogram2.png" )

Теперь полученные файлы изображений дендрограмм будут выглядеть так, как вы ожидали, что они будут выглядеть.

...