web-dev-qa-db-fra.com

Fusionner les sous-tracés matplotlib avec l'axe x partagé

J'ai deux graphiques où les deux ont le même axe x, mais avec des échelles d'axe y différentes.

Le tracé avec des axes réguliers est les données avec une ligne de tendance représentant une décroissance tandis que l'échelle semi-logarithmique représente la précision de l'ajustement.

fig1 = plt.figure(figsize=(15,6))
ax1 = fig1.add_subplot(111)

# Plot of the decay model 
ax1.plot(FreqTime1,DecayCount1, '.', color='mediumaquamarine')

# Plot of the optimized fit
ax1.plot(x1, y1M, '-k', label='Fitting Function: $f(t) = %.3f e^{%.3f\t} \
         %+.3f$' % (aR1,kR1,bR1))

ax1.set_xlabel('Time (sec)')
ax1.set_ylabel('Count')
ax1.set_title('Run 1 of Cesium-137 Decay')

# Allows me to change scales
# ax1.set_yscale('log')
ax1.legend(bbox_to_anchor=(1.0, 1.0), prop={'size':15}, fancybox=True, shadow=True)

enter image description hereenter image description here

Maintenant, j'essaie de comprendre comment implémenter les deux étroitement comme les exemples fournis par ce lien http://matplotlib.org/examples/pylab_examples/subplots_demo.html

En particulier, celui-ci

enter image description here

En regardant le code de l'exemple, je suis un peu confus sur la façon d'implanter 3 choses:

1) Mise à l'échelle différente des axes

2) En gardant la taille de la figure identique pour le graphique de décroissance exponentielle, mais en ayant un graphique linéaire, la taille y est plus petite et la même taille x.

Par exemple:

enter image description here

3) Garder l'étiquette de la fonction pour n'apparaître que dans le graphique de décroissance.

Toute aide sera très appréciée.

15
iron2man

Regardez le code et les commentaires qu'il contient:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import gridspec

# Simple data to display in various forms
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig = plt.figure()
# set height ratios for sublots
gs = gridspec.GridSpec(2, 1, height_ratios=[2, 1]) 

# the fisrt subplot
ax0 = plt.subplot(gs[0])
# log scale for axis Y of the first subplot
ax0.set_yscale("log")
line0, = ax0.plot(x, y, color='r')

#the second subplot
# shared axis X
ax1 = plt.subplot(gs[1], sharex = ax0)
line1, = ax1.plot(x, y, color='b', linestyle='--')
plt.setp(ax0.get_xticklabels(), visible=False)
# remove last tick label for the second subplot
yticks = ax1.yaxis.get_major_ticks()
yticks[-1].label1.set_visible(False)

# put lened on first subplot
ax0.legend((line0, line1), ('red line', 'blue line'), loc='lower left')

# remove vertical gap between subplots
plt.subplots_adjust(hspace=.0)
plt.show()

enter image description here

23
Serenity