2017-02-02 3 views
4

Это простой код, который воспроизводит вид графа I`m пытаются построить:Matplotlib: линии сетки над решеткой

import matplotlib.pyplot as plt 
import seaborn as sb 
import numpy as np 

x = np.arange(1,11) 
y1 = x[::-1] 
y2 = 2 ** x 

fig = plt.figure(figsize = (8,6)) 
ax1 = fig.add_subplot(111) 
plt.bar(x, y1, 1, color = 'blue') 
ax1.grid(axis = 'y') 
ax2 = ax1.twinx() 
ax2.plot(x+0.5, y2, color = 'red') 

Который производит:

enter image description here

Линии сетки из последний график строки отображается над столбцами. Как я могу положить их за решетку?

+0

Из [this] (http://stackoverflow.com/questions/1726391/matplotlib-draw-grid-lines-behind-other-graph-elements) кажется, что вы хотите использовать 'set_axisbelow (True)' с помощью документация [здесь] (http://matplotlib.org/api/axes_api.html). Кажется, я делаю ужасную работу по ее реализации, поэтому, возможно, вы доберетесь до меня. – roganjosh

+0

Я действительно этого не понимаю. Насколько я могу судить, я правильно слежу за всей документацией и примерами, я не получаю никаких ошибок, но это просто полностью игнорируется. Я не уверен, что смогу решить эту проблему. – roganjosh

ответ

0
import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(1,11) 
y1 = x[::-1] 
y2 = 2 ** x 

fig = plt.figure(figsize = (8,6)) 
ax1 = fig.add_subplot(111) 
ax2 = ax1.twinx() 

# from back to front 
ax1.grid(axis="both", color="black") 
ax1.bar(x, y1, 1, alpha=.9, edgecolor="black", facecolor='blue', zorder=1) 

ax2.grid(axis="y", color="green") 
#ax2.grid(False) 
ax2.plot(x+0.5, y2, color='red') 

plt.show() 

которые производят нижеследующий график, который иллюстрирует zorder элементов.

ax1.grid => ax1.bar => ax2.grid => ax2.line

zorder of elements in plot

единственный обходной путь я могу думать о том, чтобы построить сетку в ax1 и выключить ax2 сетку (если вы действительно хотите построить горизонтальную линию сетки для ах2, то вы, возможно, придется построить линию с ax1.

ax1.grid(True, axis="both", color="yellow") 
ax1.bar(x, y1, 1, alpha=.9, edgecolor="black", facecolor='blue', zorder=1) 

ax2.grid(False) 
ax2.plot(x+0.5, y2, color='red') 

some workaround

+0

Спасибо, это обеспечивает лучшую визуализацию. На самом деле, я использую подобный подход, так как я удалил эту строку 'ax1.grid (axis = 'y')' и добавил 'ax2.grid (False)' в конце. Однако это не совсем то, что я искал (я бы хотел, чтобы горизонтальные линии сетки только для правой оси, ax2). Из [this] (http: // stackoverflow.com/a/29542999/4862402), я узнал, что можно выровнять правую и левую отметки, но это может привести к уродливым ярлыкам на правой оси (плавает не округло), что произошло в моей реальной ситуации. –

0

После некоторые поиски и попытки, я делюсь решением, которое я нашел, поэтому другие могут использовать его в качестве ссылки в будущем. Это не совсем то, что я искал, так как я хотел бы горизонтальные линии сетки только для правой оси, однако он обеспечил гораздо лучшую визуализацию, чем исходный сюжет.

От this, я узнал, как выровнять левую и правую оси тиков (эта проблема также возникает при построении графиков линий, но эффект не такой же тревожный, как на графике).

import matplotlib.pyplot as plt 
import seaborn as sb 
import numpy as np 

x = np.arange(1,11) 
y1 = x[::-1] 
y2 = 2 ** x 

fig = plt.figure(figsize = (8,6)) 
ax1 = fig.add_subplot(111) 
plt.bar(x, y1, 1, color = 'blue') 
ax2 = ax1.twinx() 
ax2.plot(x+0.5, y2, color = 'red') 
ax2.set_yticks(np.linspace(ax2.get_yticks()[0],ax2.get_yticks()[-1],len(ax1.get_yticks()))) 

enter image description here

линий сетки еще над столбиками. Однако, поскольку метки отмечены, мы теперь можем удалить сетку второго графика линии, добавив явную команду: ax2.grid(False) в конце предыдущего кода.

enter image description here

ВАЖНО: Обратите внимание, что в этом примере метка в левой и правой оси довольно хороша. Однако в реальной ситуации такой подход может привести к уродливым ярлыкам (поплавкам или грубым целым числам) на правой оси. Используя этот подход, мы по-прежнему не в состоянии установить положение правильных меток, поэтому это не точный ответ на вопрос.