Как заставить ось, равную в matplotlib - PullRequest
0 голосов
/ 26 октября 2018

Я реализую наивный байесовский классификатор.

У меня есть следующий рисунок, показывающий мои границы классификации:

enter image description here

Я хочу сделать оси одинаково масштабированными для фигуры, потому что я думаю, что это поможет мне лучше понять, что происходит. Однако я не нашел способа сделать это. Сюжет генерируется не написанной мной функцией:

%matplotlib inline
plotBoundary(BayesClassifier(), dataset='iris',split=0.7)

# ## Plotting the decision boundary
#
# This is some code that you can use for plotting the decision boundary
# boundary in the last part of the lab.
def plotBoundary(classifier, dataset='iris', split=0.7):

    X,y,pcadim = fetchDataset(dataset)
    xTr,yTr,xTe,yTe,trIdx,teIdx = trteSplitEven(X,y,split,1)
    classes = np.unique(y)

    pca = decomposition.PCA(n_components=2)
    pca.fit(xTr)

    xTr = pca.transform(xTr)
    xTe = pca.transform(xTe)

    pX = np.vstack((xTr, xTe))
    py = np.hstack((yTr, yTe))

    # Train
    trained_classifier = classifier.trainClassifier(xTr, yTr)

    xRange = np.arange(np.min(pX[:,0]),np.max(pX[:,0]),np.abs(np.max(pX[:,0])-np.min(pX[:,0]))/100.0)
    yRange = np.arange(np.min(pX[:,1]),np.max(pX[:,1]),np.abs(np.max(pX[:,1])-np.min(pX[:,1]))/100.0)

    grid = np.zeros((yRange.size, xRange.size))

    for (xi, xx) in enumerate(xRange):
        for (yi, yy) in enumerate(yRange):
            # Predict
            grid[yi,xi] = trained_classifier.classify(np.array([[xx, yy]]))


    ys = [i+xx+(i*xx)**2 for i in range(len(classes))]
    colormap = cm.rainbow(np.linspace(0, 1, len(ys)))

    fig = plt.figure()
    # plt.hold(True)
    conv = ColorConverter()
    for (color, c) in zip(colormap, classes):
        try:
            CS = plt.contour(xRange,yRange,(grid==c).astype(float),15,linewidths=0.25,colors=conv.to_rgba_array(color))
        except ValueError:
            pass
        trClIdx = np.where(y[trIdx] == c)[0]
        teClIdx = np.where(y[teIdx] == c)[0]
        plt.scatter(xTr[trClIdx,0],xTr[trClIdx,1],marker='o',c=color,s=40,alpha=0.5, label="Class "+str(c)+" Train")
        plt.scatter(xTe[teClIdx,0],xTe[teClIdx,1],marker='*',c=color,s=50,alpha=0.8, label="Class "+str(c)+" Test")
    plt.legend(bbox_to_anchor=(1., 1), loc=2, borderaxespad=0.)
    fig.subplots_adjust(right=0.7)
    plt.axis("equal") # <------- TRIED TO INJECT axis("equal") here
    plt.show()

Я пытался вставить plt.axis("equal") в эту функцию (1 строка в нижней части кода), но это не делает мои оси равными. Как мне этого добиться?

РЕДАКТИРОВАТЬ: Я также пытался ввести plt.gca().set_aspect('equal', adjustable='box'). Это ничего не изменило.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы можете установить пределы вручную:

xmin, xmax = plt.xlim()
ymin, ymax = plt.ylim()

fmin = min(xmin, ymin)
fmax = max(xmax, ymax)

plt.xlim(fmin, fmax)
plt.ylim(fmin, fmax)

Затем убедитесь, что у вас есть соотношение сторон 1: 1

0 голосов
/ 26 октября 2018

равное ключевое слово масштабирует x и y, чтобы быть в том же масштабе. Однако, если вы хотите получить квадратную ось, попробуйте plt.axis('box')

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