Matplotlib:栏上方的网格线

时间:2017-02-02 16:06:43

标签: python matplotlib seaborn

这是一个简单的代码,可以再现我试图绘制的图形类型:

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

最后一行图中的网格线显示在条形图上方。我怎么能把它们放在酒吧后面?

2 个答案:

答案 0 :(得分: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网格(如果你真的想绘制ax2的水平网格线,那么你可能需要用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

答案 1 :(得分: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

重要提示:请注意,在此示例中,左右轴上的标签都非常好。但是,在实际情况下,这种方法可能会导致右轴上出现丑陋的标签(浮动或粗糙整数)。使用这种方法,我们仍然无法设置正确的刻度线的位置,因此它不是问题的准确答案。