14

メインの x 軸と y 軸の zorder をいじらずに、グラフの下にグリッド線をプロットするのに苦労しています。

import matplotlib.pyplot as plt
import numpy as np


N = 5
menMeans = (20, 35, 30, 35, 27)
menStd =   (2, 3, 4, 1, 2)

ind = np.arange(N)  # the x locations for the groups
width = 0.35       # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(ind, menMeans, width, color='r', yerr=menStd, alpha=0.9, linewidth = 0,zorder=3)

womenMeans = (25, 32, 34, 20, 25)
womenStd =   (3, 5, 2, 3, 3)
rects2 = ax.bar(ind+width, womenMeans, width, color='y', yerr=womenStd, alpha=0.9, linewidth = 0,zorder=3)

# add some
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('G1', 'G2', 'G3', 'G4', 'G5') )

ax.legend( (rects1[0], rects2[0]), ('Men', 'Women') )

fig.gca().yaxis.grid(True, which='major', linestyle='-', color='#D9D9D9',zorder=2, alpha = .9)
[line.set_zorder(4) for line in ax.lines]

def autolabel(rects):
    # attach some text labels
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.05*height, '%d'%int(height),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)

plt.show()

この例は matplotlib のものから取ったもので、問題を表示する方法を示すために少し調整しました。画像を投稿することはできませんが、コードを実行すると、バーが水平グリッド線の上と x 軸と y 軸の上にプロットされていることがわかります。特に目盛りもブロックされている場合、x軸とy軸がグラフによって隠されたくありません。

4

5 に答える 5

4

matplotlib 1.2.1、1.3.1rc2、およびマスターを試しました (コミット 06d014469fc5c79504a1b40e7d45bc33acc00773)

バーの上に軸スパインを取得するには、次の操作を実行できます。

for k, spine in ax.spines.items():  #ax.spines is a dictionary
    spine.set_zorder(10)

編集

バーの上にティックラインを入れることができないようです。私はもう試した

1. ax.tick_params(direction='in', length=10, color='k', zorder=10)
   #This increases the size of the lines to 10 points, 
   #but the lines stays hidden behind  the bars
2. for l in ax.yaxis.get_ticklines():
       l.set_zorder(10)

結果のない他の方法。バーを描画すると、バーが上に置かれ、zorder が無視されるようです

回避策は、目盛り線を外側に描くことです

ax.tick_params(direction='out', length=4, color='k', zorder=10)

または、内側と外側の両方を使用してdirection='inout'

EDIT2

@tcaswell のコメントの後、いくつかのテストを行いました。

関数zorderax.barで <=2 に設定されている場合、軸、目盛り線、およびグリッド線がバーの上に描画されます。値が >2.01 (軸のデフォルト値) の場合、バーは軸、目盛線、およびグリッドの上に描画されます。次に、スパインに大きな値を設定することができますが (上記のように)、ティックラインを変更しようとしてもzorder無視されます (ただし、対応するアーティストの値は更新されます)。

zorder=1をグリッドに使用しようとしましたが、グリッドはバーの上に描画されます。したがって、zorder は無視されます。barzorder=0

要約

目盛りとグリッドzorderは無視され、デフォルト値のままになっているようです。私にとって、これはbaror someに何らかの形で関連するバグpatchesです。

ところで、使用時にティックラインのzorderを正常に変更したことを覚えていますimshow

于 2013-10-30T09:28:57.590 に答える
1

@luke_16と同じように、軸の上にプロットするという同じ問題がありました。私の場合、ax.set_axisbelow(True)プロットの後ろにグラインドを設定するオプションを使用したときに発生しました。

このバグに対する私の回避策は、オンボード グリッドを使用するのではなく、シミュレートすることです。

def grid_selfmade(ax,minor=False):
    y_axis=ax.yaxis.get_view_interval()
    for xx in ax.xaxis.get_ticklocs():
        ax.plot([xx,xx],y_axis,linestyle=':',linewidth=0.5,zorder=0)
    if minor==True:
        for xx in ax.xaxis.get_ticklocs(minor=True):
            ax.plot([xx,xx],y_axis,linestyle=':',linewidth=0.5,zorder=0)
    x_axis=ax.xaxis.get_view_interval()
    for yy in ax.yaxis.get_ticklocs():
        ax.plot(x_axis,[yy,yy],linestyle=':',linewidth=0.5,zorder=0,)
    if minor==True:
        for yy in ax.yaxis.get_ticklocs(minor=True):
            ax.plot(x_axis,[yy,yy],linestyle=':',linewidth=0.5,zorder=0)

この関数は、現在の axis-instance のみを必要とし、主要な目盛りで他のすべての背後にオンボードのようなグリッドを描画します (小さな目盛りでもオプションです)。

グラフの上に軸と軸の目盛りを表示するには、プロットで >2 を使用しないようにしておく必要がax.set_axisbelow(False)ありますFalse。コード内のプロット コマンドの順序を変更することzorderで、オプションなしでプロットの zorder を管理しました。zorder

于 2015-02-09T21:37:54.537 に答える