2016-10-20 5 views
2

У меня возникли проблемы с matplotlib в Python, пытаясь создать два участка бок о бок. Мне удалось заставить их оставаться рядом друг с другом, но мне нужно, чтобы они имели одинаковый размер: каждая точка в правой части должна быть легко сопоставлена ​​с местоположением на левой стороне невооруженным глазом. Вместо этого мой правый (который представляет собой график рассеяния) имеет некоторые поля, которые делают его немного меньшим, чем левое (карта тепла).matplotlib: подзаголовки такого же размера?

enter image description here

Как я генерировать Heatmap является:

def plot_map(matrix): 
    # Plot it out 
    #fig, ax = plt.subplots() 
    fig = plt.figure() 
    ax = plt.subplot(1,2,1) 
    c = m.colors.ColorConverter().to_rgb 
    cm = make_colormap([(0,1,0), (1,1,0), 0.1, (1,1,0), (1,0.5,0), 0.66, (1,0.5,0),(1,0,0)]) 
    heatmap = ax.pcolor(matrix, cmap=cm) 

    # Format 
    fig = plt.gcf() 
    fig.set_size_inches(20, 20) 
    plt.gca().set_aspect('equal') 
    # turn off the frame 
    ax.set_frame_on(False) 

    # put the major ticks at the middle of each cell 
    ax.set_yticks(np.arange(matrix.shape[0]) + 0.5, minor=False) 
    ax.set_xticks(np.arange(matrix.shape[1]) + 0.5, minor=False) 

    # want a more natural, table-like display 
    ax.invert_yaxis() 
    ax.xaxis.tick_top() 

    # note I could have used matrix.columns but made "labels" instead 
    ax.set_xticklabels(range(0,matrix.shape[0]), minor=False) 
    ax.set_yticklabels(range(0,matrix.shape[1]), minor=False) 
    ax.grid(False) 

    # Turn off all the ticks 
    ax = plt.gca() 

    for t in ax.xaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    for t in ax.yaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 

    divider = make_axes_locatable(ax)  
    cax = divider.append_axes("right", size="5%", pad=0.05) 
    plt.colorbar(heatmap,cax=cax) 

    return (fig,ax) 

Затем топор перешел в другую функцию, чтобы построить маленькие голубые линии на карте:

def plot_chosen(edges,endnodes,side,ax): 
    for e in edges: 
     u = endnodes[e - 1][0] 
     v = endnodes[e - 1][1] 
     xu, yu = get_center(u,side) 
     xv, yv = get_center(v,side) 
     ax.plot([xu+0.5, xv+0.5], [yu+0.5, yv+0.5], 'k-', lw=4, color='blue',alpha=0.5) 

Наконец, я рисую разброс следующим образом:

def plot_satter(edges,endnodes,side,xs,ys,data): 
    plt.margins(0) 
    ax = plt.subplot(1, 2, 2) 
     # Format 
    fig = plt.gcf() 
    fig.set_size_inches(20, 20) 
    plt.gca().set_aspect('equal') 
    # turn off the frame 
    ax.set_frame_on(False) 

    # put the major ticks at the middle of each cell 
    ax.set_yticks(np.arange(side) + 0.5, minor=False) 
    ax.set_xticks(np.arange(side) + 0.5, minor=False) 

    # want a more natural, table-like display 
    ax.invert_yaxis() 
    ax.xaxis.tick_top() 

    ax.set_xmargin(0) 
    ax.set_ymargin(0) 

    # note I could have used matrix.columns but made "labels" instead 
    ax.set_xticklabels(range(0,side), minor=False) 
    ax.set_yticklabels(range(0,side), minor=False) 
    ax.grid(False) 

    # Turn off all the ticks 
    ax = plt.gca() 

    for t in ax.xaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    for t in ax.yaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    cm = make_colormap([(0,0,1), (0,1,1), 0.1, (0,1,1), (1,1,0), 0.66, (1,1,0),(1,0,0)]) 
    resmap = plt.scatter(xs,ys, c=data,cmap=cm,edgecolors='none',alpha=0.5,s=data) 
    divider = make_axes_locatable(ax)  
    cax = divider.append_axes("right", size="5%", pad=0.05) 
    plt.colorbar(resmap,cax=cax) 

Но я не нахожу никакого способа сделать участок рассеяния размером с тепловую карту. На самом деле, он должен быть таким же большим, как и цветной, но это тоже не работает ... Si это заставляет меня думать, что есть некоторый запас вокруг разброса.

Кроме того, есть ли способ, которым я мог бы сделать весь файл PNG не таким квадратным? Может быть, это прямоугольник?

Спасибо!

+1

Существует много кода ... вы можете убрать как можно больше и сделать его runnable [MCVE] (http://stackoverflow.com/help/mcve) -example? – pathoren

ответ

2

Для того, чтобы получить помощь, вам необходимо предоставить minimal working example. Вы узнаете, что получение такого minimal working example, почти всегда заставляет вас найти проблему и соответствующее решение самостоятельно.
Кроме того, структурируйте свой код!

Поскольку у нас нет необходимых знаний о ваших данных и переменных, которые вы используете, практически невозможно придумать решение.

Что вам нужно сделать, так это решить проблему. Вы ищете разницу между двумя вещами - сделайте их как можно более равными. Если вы примените все к обоим сюжетам одновременно, как они могут быть разными в конце концов?

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

import matplotlib.pyplot as plt 
import numpy as np 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

x = np.linspace(0,100,101) 
X, Y = np.meshgrid(x,x) 
data = np.sin(X/2.3)*np.cos(Y/2.7)*np.cos(X*Y/20.) 

fig = plt.figure(figsize=(10,5)) 
ax1=fig.add_subplot(121) 
ax2=fig.add_subplot(122) 
plt.subplots_adjust(wspace = 0.33) 

heatmap = ax1.pcolor(data, cmap="RdPu") 
resmap = ax2.scatter(X,Y, c=data, cmap="YlGnBu",edgecolors='none',alpha=0.5) 


for ax in [ax1,ax2]: 
    ax.set_frame_on(False) 

    ax.set_aspect('equal') 

    ax.invert_yaxis() 
    ax.xaxis.tick_top() 

    ax.set_xmargin(0) 
    ax.set_ymargin(0) 

    ax.grid(False) 

    for t in ax.xaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    for t in ax.yaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 

    ax.set_xlim([x[0],x[-1]]) 
    ax.set_ylim([x[0],x[-1]]) 


divider1 = make_axes_locatable(ax1)  
cax1 = divider1.append_axes("right", size="5%", pad=0.05) 
plt.colorbar(heatmap,cax=cax1) 

divider2 = make_axes_locatable(ax2)  
cax2 = divider2.append_axes("right", size="5%", pad=0.05) 
plt.colorbar(resmap,cax=cax2) 

plt.show() 

И кстати, fig = plt.figure(figsize=(10,5)) производит прямоугольник, в то время как fig = plt.figure(figsize=(20,20)) производит квадрат.

+0

Привет, спасибо за помощь! Я не думал о создании меньшего экземпляра, потому что, хотя это было бы несколько очевидным для людей, которые используют matplotlib. Во всех случаях моя проблема заключалась в том, что я отсутствовал: 'ax.set_xlim ([x [0], x [-1]]) ax.set_ylim ([x [0], x [-1]])' на разброс. Спасибо за это! – ddeunagomez