Добавление меток осей к подфигу с хинтон-диаграммами в matplotlib, не разрушая его - PullRequest
0 голосов
/ 04 декабря 2011

Я нашел этот пример о том, как сделать диаграмму хинтона с помощью matplotlib: http://www.scipy.org/Cookbook/Matplotlib/HintonDiagrams.

Мне понадобилось несколько диаграмм и яксис с метками на галочках, поэтому я переписал это так:

import matplotlib.pyplot as plt
import numpy as N

def hintonForTwo(W1, W2, maxWeight=None):

    height, width = W1.shape
    if not maxWeight:
        maxWeight = 2**N.ceil(N.log(N.max(N.abs(W1)))/N.log(2))

    fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, sharey=True)

    hintonSubPlot(ax1, W1, maxWeight)
    ax1.set_yticks(N.arange(height))
    # the input matrices will have row height of 7
    # and years 1981, 1986... up to 2011 are supposed to be the ytick labels
    ax1.set_yticklabels(tuple(range(1981,2012,5)))
    ax1.set_aspect('equal')
    ax1.set_axis_off()
    hintonSubPlot(ax2, W2, maxWeight)
    return fig, ax1, ax2

def hintonSubPlot(F, W, maxWeight):
    height, width = W.shape
    F.fill(N.array([0,width,width,0]),N.array([0,0,height,height]),'white')

    for x in xrange(width):
        for y in xrange(height):
                _x = x+1
            _y = y+1
            w = W[y,x]
            if w > 0:
                _blobAlt(F, _x - 0.5, height - _y + 0.5, min(1,w/maxWeight),'black')
            elif w < 0:
                _blobAlt(F, _x - 0.5, height - _y + 0.5, min(1,-w/maxWeight),'gray')
    return F

def _blobAlt(F, x,y,area,colour):
    hs = N.sqrt(area) / 2
    xcorners = N.array([x - hs, x + hs, x + hs, x - hs])
    ycorners = N.array([y - hs, y - hs, y + hs, y + hs])
    F.fill(xcorners, ycorners, colour, edgecolor=colour)

dim = (7,50)
X1 = N.ones(dim) * N.nan
X2 = N.ones(dim) * N.nan

rm = N.random.random(dim)
X1[rm > 2.0/3] = 1
X1[rm < 1.0/3] = -1

rm = N.random.random(dim)
X2[rm > 2.0/3] = 1
X2[rm < 1.0/3] = -1

f, a, b = hintonForTwo(X1, X2)
f.savefig('tmp.png')

Но есть несколько проблем, которые я не могу исправить:

  1. Если сделать ax1.set_axis_off (), я не могу получить ярлыки ytick
  2. Если оставить оси включенными, я получаю большие пустые прямоугольники вокруг нижнего подфига
  3. Даже если оси отключены, между верхним подфигом и нижним подфигом есть большой зазор, который я не могу сузить

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

1 Ответ

0 голосов
/ 08 января 2012

Ваш код еще не завершен. Однако, если вы просто хотите отрегулировать интервал между вспомогательными участками, выборочно удалить некоторые уровни, вы можете попробовать:

import numpy as np
import pylab as p


fig = p.figure()
fig.subplots_adjust(left=0.145, bottom=0.13, right=.87, top=.975, wspace=.18, hspace=.10)

x=np.arange(1,10,0.01)
ax1=fig.add_subplot(211)
ax1.plot(x,np.sin(x),'ro')
ax1.set_ylabel('sin(x)')

ax2=fig.add_subplot(212,sharex=ax1,sharey=ax1)
ax2.plot(x,np.cos(x),'bs')
ax2.set_xlabel('x')
ax2.set_ylabel('cos(x)')

for label in ax1.get_xticklabels():
    label.set_visible(False)

p.show()

Plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...