我正在尝试将线图和条形图合并为一个图。数据源是一个pandas数据帧。
这是一个演示:
import pandas as pd
test = {"index": range(10),
"line": [i**2 for i in range(10)],
"bar": [i*10 for i in range(10)]}
test=pd.DataFrame(test)
ax=test.plot(x="index",y="line")
test.plot(x="index",y="bar",color="r",kind="bar",ax=ax)
到目前为止,一切都很好,你可以看到线条在条形图上方。如果我通过将最后一行更改为:
,请在右侧使用辅助yaxis询问条形图test.plot(x="index",y="bar",color="r",kind="bar",ax=ax, secondary_y=True)
然后条形线将位于线条顶部,这不是我想要的。
以下是两个图:
我试图首先绘制条形图然后绘制线条,我也尝试使用zorder
来强制条形图上方的线条,但它们都不起作用。
任何建议或帮助都将不胜感激。
答案 0 :(得分:4)
第二个轴将始终位于第一个轴的顶部。因此,您需要最后绘制线图以使其显示在条形图的顶部。 您可以考虑以下解决方案,该方法将行设置为二级标度:
import pandas as pd
test = {"index": range(10),
"line": [i**2 for i in range(10)],
"bar": [100*i*10 for i in range(10)]}
test=pd.DataFrame(test)
ax = test.plot(x="index",y="bar",color="r",kind="bar")
ax2 = test.plot(x="index",y="line", color="b", ax=ax, secondary_y=True)
ax.set_ylabel("bar", color="r")
ax2.set_ylabel("line", color="b")
如果您想在图表的左侧使用线条比例,您可以在之后交换比例:
import pandas as pd
test = {"index": range(10),
"line": [i**2 for i in range(10)],
"bar": [100*i*10 for i in range(10)]}
test=pd.DataFrame(test)
ax = test.plot(x="index",y="bar",color="r",kind="bar")
ax2 = test.plot(x="index",y="line", color="b", ax=ax, secondary_y=True)
ax.yaxis.tick_right()
ax2.yaxis.tick_left()
ax.set_ylabel("bar", color="r")
ax2.set_ylabel("line", color="b")
ax.yaxis.set_label_position("right")
ax2.yaxis.set_label_position("left")