2017-04-10 16 views
4

異なるY軸を持つ複数のエラーバーを1つのサブプロットにプロットするとき、現在matplotlibのいくつかの奇妙な動作を扱っています。Matplotlib複数のグリッドzorderがエラーバーで動作しない

このようにすると、2番目のエラーバープロットに対応するグリッドは常に最初のエラーバープロットと重なります。 zorderオプションでは、エラーバーの下の他のグリッドを移動することしかできませんでした。

両方のグリッドが2つのエラーバー以下になるようにしたいと思います。 誰かがこれに対する解決策を知っていますか、これはmatplotlibのバグですか?

matplotlib 1.5.1でPython 2.7.12を使用しています。

最小限の作業例:

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() 

出力プロット(オレンジグリッドドットが青いバーが重複している): Multiple errorbars with multiple grids

答えて

1

たぶん、あなたは二回「海軍の線を引くことができます。

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() 

そして、あなたが得る: enter image description here

+1

どうもありがとう!確かに、これは問題を解決しました。右側に追加のラベルを取り除くために、 'ax3.get_yaxis()。set_visible(False)'を追加しました。 – ml4294

+0

@ ml4294改善をありがとう! – xiaoyi

関連する問題