2017-04-10 6 views
4

Ich bin derzeit mit einigen seltsamen Verhalten von Matplotlib beim Plotten mehrere Fehlerbalken mit verschiedenen y-Achsen in einem Teilplot.Matplotlib mehrere Gitter zorder nicht mit Fehlerbars arbeiten

Dabei überlappt das Raster, das dem zweiten Fehlerbalkenplot entspricht, immer den ersten Fehlerbalkenplot. Mit den Optionen zorder konnte ich nur das andere Raster unterhalb der Fehlerbalken verschieben.

Ich möchte beide Gitter unter den zwei Fehlerbalken sein. Kennt jemand eine Lösung, oder ist das ein Fehler in Matplotlib?

Ich benutze Python 2.7.12 mit Matplotlib 1.5.1.

Minimal Arbeitsbeispiel:

import numpy as np 
import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plt 
import matplotlib.colors as colors 

# numbers of epochs 
ttimes_means_list = [251.4, 153.3, 22.0, 202.1, 46.6] 
ttimes_stddevs_list = [32.1, 35.1, 12.0, 84.9, 14.7] 
# numbers of times 
times_means_list = [5231, 3167, 860, 3932, 1244] 
times_stddevs_list = [1381, 572, 253, 1445, 215] 

labels = ['x1', 'x2', 'x3', 'x4', 'x5'] 
linewidth=3 

xvalues = np.arange(0, len(times_means_list), 1) 
xvalues_s = xvalues + 0.1 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twinx() 
ax1.set_ylabel('Number') 
ax1.xaxis.grid(False) 
ax1.yaxis.grid(True, color='navy', linewidth=linewidth/2.0) 
ax2.xaxis.grid(False) 
ax1.set_zorder(0) 
ax2.set_zorder(0) 
ax2.yaxis.grid(True, color='darkorange', linewidth=linewidth/2.0) 
ax2.set_ylabel('Time') 
ax1.set_xticks(xvalues) 
ax2.set_xticks(xvalues) 
ax1.set_xticklabels(labels) 
ax2.set_xticklabels(labels) 
ax1.set_xlabel('x label') 
errplot1 = ax1.errorbar(xvalues, ttimes_means_list, yerr=ttimes_stddevs_list, 
     linestyle="None", elinewidth=linewidth, color='navy', label='Number', 
     capthick=linewidth, zorder=10) 
errplot2 = ax2.errorbar(xvalues_s, times_means_list, yerr=times_stddevs_list, 
     linestyle="None", elinewidth=linewidth, color='darkorange', 
     label='Time', capthick=linewidth, zorder=10) 
ax1.set_axisbelow(True) 
ax2.set_axisbelow(True) 
fig.legend((errplot1, errplot2), ('number', 'time'), 
     loc='upper right', numpoints=1) 
plt.xlim(-0.5, len(times_means_list)-0.5) 
plt.title('Some plot title') 
plt.savefig('mwe_plot.pdf') 
plt.clf() 

Output plot (die orangefarbenen Rasterpunkte überschneiden sich die blauen Balken): Multiple errorbars with multiple grids

Antwort

1

Vielleicht können Sie die 'Marine' Linie zweimal ziehen.

import numpy as np 
import matplotlib 
matplotlib.use('Agg') 
import matplotlib.pyplot as plt 
import matplotlib.colors as colors 

# numbers of epochs 
ttimes_means_list = [251.4, 153.3, 22.0, 202.1, 46.6] 
ttimes_stddevs_list = [32.1, 35.1, 12.0, 84.9, 14.7] 
# numbers of times 
times_means_list = [5231, 3167, 860, 3932, 1244] 
times_stddevs_list = [1381, 572, 253, 1445, 215] 

labels = ['x1', 'x2', 'x3', 'x4', 'x5'] 
linewidth=3 

xvalues = np.arange(0, len(times_means_list), 1) 
xvalues_s = xvalues + 0.1 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twinx() 
ax1.set_ylabel('Number') 
ax1.xaxis.grid(False) 
g1 = ax1.yaxis.grid(True, color='navy', linewidth=linewidth/2.0) 
ax2.xaxis.grid(False) 
ax1.set_zorder(0) 
ax2.set_zorder(0) 
g2 = ax2.yaxis.grid(True, color='darkorange', linewidth=linewidth/2.0) 
ax2.set_ylabel('Time') 
ax1.set_xticks(xvalues) 
ax2.set_xticks(xvalues) 
ax1.set_xticklabels(labels) 
ax2.set_xticklabels(labels) 
ax1.set_xlabel('x label') 
ax1.errorbar(xvalues, ttimes_means_list, yerr=ttimes_stddevs_list, 
     linestyle="None", elinewidth=1, color='navy', label='Number', 
     capthick=1, zorder=10,) 
errplot2 = ax2.errorbar(xvalues_s, times_means_list, yerr=times_stddevs_list, 
     linestyle="None", elinewidth=linewidth, color='darkorange', 
     label='Time', capthick=linewidth, zorder=10) 
ax1.set_axisbelow(True) 
ax2.set_axisbelow(True) 

# draw the 'navy' line again 
ax3 = ax1.twinx() 
ax3.yaxis.grid(False) 
errplot1 = ax3.errorbar(xvalues, ttimes_means_list, yerr=ttimes_stddevs_list, 
     linestyle="None", elinewidth=linewidth, color='navy', label='Number', 
     capthick=linewidth, zorder=10) 

fig.legend((errplot1, errplot2), ('number', 'time'), 
     loc='upper right', numpoints=1) 
plt.xlim(-0.5, len(times_means_list)-0.5) 
plt.title('Some plot title') 
# plt.savefig('mwe_plot.pdf') 
# plt.clf() 

plt.show() 

Und Sie erhalten: enter image description here

+1

Vielen Dank! In der Tat hat dies das Problem gelöst. Ich habe gerade 'ax3.get_yaxis(). Set_visible (False)' hinzugefügt, um die zusätzlichen Bezeichnungen auf der rechten Seite loszuwerden. – ml4294

+0

@ ml4294 Vielen Dank für Ihre Verbesserung! – xiaoyi