J'ai des difficultés avec matplotlib en Python pour créer deux graphiques côte à côte. J'ai réussi à les faire rester l'un à côté de l'autre, mais j'ai besoin qu'ils aient exactement la même taille : chaque point du graphique de droite doit pouvoir être facilement mis en correspondance avec un emplacement du graphique de gauche à l'œil nu. Au lieu de cela, le graphique de droite (qui est un diagramme de dispersion) présente des marges qui le font paraître légèrement plus petit que le graphique de gauche (une carte thermique).
La façon dont je génère la carte thermique est la suivante :
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)
Ensuite, l'axe est transmis à une autre fonction pour tracer les petites lignes bleues sur la carte :
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)
Enfin, je trace la courbe de dispersion comme suit
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)
Mais je ne trouve aucun moyen de rendre le nuage de points aussi grand que la carte thermique. En fait, il est censé être aussi grand que sa barre de couleur, mais cela ne fonctionne pas non plus... Si cela me fait penser qu'il y a une certaine marge autour du nuage de points....
Par ailleurs, existe-t-il un moyen de rendre le fichier PNG moins carré ? Pourrait-il s'agir d'un rectangle ?
Merci !