顶部带有线的多轴图。 Matplotlib
Posted
技术标签:
【中文标题】顶部带有线的多轴图。 Matplotlib【英文标题】:Multi-Axis Graph with Line on top. Matplotlib 【发布时间】:2015-07-21 05:39:12 【问题描述】:我正在尝试使用 twinx() 创建一个条形/线条组合图,线条在条形顶部可见。目前是这样的:
我还需要在左侧垂直轴 (ax) 和右侧 (ax2) 上绘制当前的折线图。如果我在第二个轴上绘制线,它确实出现在顶部,但显然它出现在错误的轴上(右)
这是我的代码:
self.ax2=ax.twinx()
df[['Opportunities']].plot(kind='bar', stacked=False, title=get_title, color='grey', ax=self.ax2, grid=False)
ax.plot(ax.get_xticks(),df[['Percentage']].values, linestyle='-', marker='o', color='k', linewidth=1.0)
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = self.ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='lower right')
标签也有问题,但一次只做一件事。
【问题讨论】:
【参考方案1】:默认情况下,艺术家首先在ax
上绘制,然后是
双轴上的艺术家ax2
在顶部。因此,由于在您的代码中,线图是在 ax
上绘制的,而条形图是在 ax2
上绘制的,因此条形图位于(并遮住)线的顶部。
(我以为我可以通过指定 zorder
来改变这一点,但那次尝试并没有
工作......)
所以解决问题的一种方法是使用ax
绘制条形图,使用ax2
绘制线条。这会将线放在条形图的顶部。默认情况下,它还会将ax
(条形图)的ytick 标签放在左侧,将ax2
(线条)的ytick 标签放在右侧。但是,您可以使用
ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")
交换左右 ytick 标签的位置。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
np.random.seed(2015)
N = 16
df = pd.DataFrame('Opportunities': np.random.randint(0, 30, size=N),
'Percentage': np.random.randint(0, 100, size=N),
index=pd.date_range('2015-3-15', periods=N, freq='B').date)
fig, ax = plt.subplots()
df[['Opportunities']].plot(kind='bar', stacked=False, title='get_title',
color='grey', ax=ax, grid=False)
ax2 = ax.twinx()
ax2.plot(ax.get_xticks(), df[['Percentage']].values, linestyle='-', marker='o',
color='k', linewidth=1.0, label='percentage')
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='best')
ax.yaxis.set_ticks_position("right")
ax2.yaxis.set_ticks_position("left")
fig.autofmt_xdate()
plt.show()
产量
或者,可以设置轴的zorder
,以便在ax2
上方绘制ax
。 Paul Ivanov shows how:
ax.set_zorder(ax2.get_zorder()+1) # put ax in front of ax2
ax.patch.set_visible(False) # hide the 'canvas'
ax2.patch.set_visible(True) # show the 'canvas'
因此,
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
np.random.seed(2015)
N = 16
df = pd.DataFrame('Opportunities': np.random.randint(0, 30, size=N),
'Percentage': np.random.randint(0, 100, size=N),
index=pd.date_range('2015-3-15', periods=N, freq='B').date)
fig, ax = plt.subplots()
ax2 = ax.twinx()
df[['Opportunities']].plot(kind='bar', stacked=False, title='get_title',
color='grey', ax=ax2, grid=False)
ax.plot(ax.get_xticks(), df[['Percentage']].values, linestyle='-', marker='o',
color='k', linewidth=1.0, label='percentage')
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax.legend(lines + lines2, labels + labels2, loc='best')
ax.set_zorder(ax2.get_zorder()+1) # put ax in front of ax2
ax.patch.set_visible(False) # hide the 'canvas'
ax2.patch.set_visible(True) # show the 'canvas'
fig.autofmt_xdate()
plt.show()
无需交换ax
和ax2
所扮演的角色即可产生相同的结果。
【讨论】:
这很棒。非常感谢!以上是关于顶部带有线的多轴图。 Matplotlib的主要内容,如果未能解决你的问题,请参考以下文章