Дендрограмма, созданная scipy-cluster, не показывает

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

Ответы

Ответ 1

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

ipython -pylab

Чтобы отобразить вашу графику во время выполнения автономного script, используйте вызов 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()

Ответ 2

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

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

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

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

Поправка: будьте осторожны, просто используя copy-and-paste с инструкцией по пакету пакета 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 между вызовами dendrogram:

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

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