matplotlib: при использовании стиля «пять тридцать восемь», как рисовать линию сетки за полосой и легендой

В качестве заголовка, как я могу переместить линию сетки позади, используя такой стиль, как «пять тридцать восемь»?

Я пробовал Axis.set_axisbelow(True) и ax.grid(zorder=0) , но ни один из них не работает.

Рисунок показан здесь

Как видите, линия сетки находится поверх легенды, что затрудняет ее чтение.

Код показан здесь:

import pandas as pd

import matplotlib.pyplot as plt



plt.style.use('fivethirtyeight')



data = pd.DataFrame(np.array([['Bacterial alpha-amylase', 1.0, 4.0, 0.0, 4.0] ,
['Fungal glucoamylase', 7.5, 24.0, 0.0, 24.0] ,
['Fungal phytase', 2.2, 6.0, 0.0, 6.0] ,
['Bacterial protease', 4.3, 14.0, 0.0, 14.0] ,
['Bacterial amylase', 10.2, 29.0, 0.0, 29.0] ,
['GSK_A', 12.0, 65.0, 0.0, 65.0] ,
['GSK_B', 3.0, 25.0, 0.0, 25.0] ,
['GSK_C', 4.0, 35.0, 0.0, 35.0] ,
['Ecoinvent_Europe', 6.4237, 0.052362, 0.0, 0.052362] ,
['Ecoinvent_rest of world', 8.8557, 0.056691, 0.0, 0.056691] ,
['Rhodium', 34967.0, 587.81, 587.81, 0.0]]), 
columns = ['enzyme', 'GWP100', 'Acidification', 'new_acid_2', 'new_acid_1'])

# the one below is to convert my numbers to float,
# which is set as string by default in the first place by python

for i in data.columns.values:
    if i =='enzyme':
        pass
    else:
        data[i] = data[i].astype(float)




fig = plt.figure(2, figsize=(6,4))


ax3 = fig.add_subplot(111)
ax4 = ax3.twinx()

data['new_acid_2'] = data.Acidification
data.loc[data['new_acid_2']<100, 'new_acid_2'] = 0

data['new_acid_1'] = data.Acidification
data.loc[data['new_acid_1'] > 100, 'new_acid_1'] = 0


my_label = data.enzyme.values


x_pos = np.arange(11)


h1 = ax3.bar(x_pos, data.new_acid_1.values,  label=my_label)
h2 = ax4.bar(x_pos, data.new_acid_2.values,  label=my_label)
h1[-1].set_color('maroon')
h2[-1].set_color('maroon')


ax3.legend(h2,my_label, loc = 2,fontsize = 8)
ax3.set_axisbelow(True)


plt.show()

Как я могу переместить свою линию сетки назад при использовании такого стиля, как «пять тридцать восемь»?

Любое предложение приветствуется. Заранее спасибо.


person chiouthebiya    schedule 23.09.2018    source источник


Ответы (1)


Имеет смысл не показывать линии сетки с двумя осями, потому что это делает интервал ax3 неравномерным. Добавьте следующие две строки после построения h1 и h2

ax3.grid(zorder=0)
ax4.grid(False)

Альтернативным решением является использование zorder=1 при построении гистограммы. zorder баров должно быть больше, чем у сетки (по умолчанию 0). Думайте о zorder как о глубине двухмерного холста/фигуры, которую вы видите там, где глубина уходит в бумагу/экран.

h1 = ax3.bar(x_pos, data.new_acid_1.values,  label=my_label,zorder=1)
h2 = ax4.bar(x_pos, data.new_acid_2.values,  label=my_label, zorder=1)
ax3.grid(True)
ax4.grid(False)

Вывод

введите здесь описание изображения

person Sheldore    schedule 23.09.2018
comment
Спасибо Bazinga. Я использую ax4.grid(False), и это намного лучше. Но что, если мне все еще нужна линия сетки для двойной оси (ax2), как мне этого добиться? либо ax4.grid(zorder =0), либо h2 = ax4.bar(x_pos, data.new_acid_2.values, label=my_label,zorder=1) не работают, чтобы сделать линию сетки двойной оси за полосой и легендой. - person chiouthebiya; 24.09.2018
comment
Использовать ax2.grid(False) - person Sheldore; 24.09.2018