相同颜色和线条的条形图和线图在条形图后面

Posted

技术标签:

【中文标题】相同颜色和线条的条形图和线图在条形图后面【英文标题】:Bar and line plot of the same color and line is behind the bars 【发布时间】:2021-12-23 18:11:31 【问题描述】:

我想在同一轴上绘制条形图和折线图。 线图应该在条形图上方,颜色应该像预期的那样循环,连续两次调用plt.plot()

import matplotlib.pyplot as plt
import math

if __name__ == "__main__":
    xs = range(1,10)
    data = [0.3, 0.2, 0.1, 0.05, 0.05, 0.11, 0.09, 0.05, 0.07]
    benfords = [math.log10(float(d + 1)/d) for d in xs]

    plt.bar(xs, data, ec='black', label='Data1')
    plt.plot(xs, benfords, linestyle='--', marker='o', label="Benford's")

    plt.xlabel('Digit')
    plt.ylabel('Frequency')

    plt.legend()
    plt.show()

此代码生成:

同时添加 zorder=1zorder=2(或任意两个连续数字,如 3 和 4 等)也无济于事。 当bar 替换为plot 时,两条不同颜色的线图按预期出现。

Python 版本:2.7.8 Matplotlib 版本:2.2.5 操作系统:Windows 10 x64

【问题讨论】:

它是匹配的,因为它是相同的颜色。将“color = 'red'”添加到线图线,你会看到不同 对不起,看来他们的zorder确实是对的!谢谢)但是颜色呢?为什么不通过prop_cycler 进一步循环? “为什么不通过prop_cycler进一步循环?” 因为条和线不共享一个prop_cycle,所以每个艺术家都使用自己的...查看axes.baraxes.plot 的源代码。 【参考方案1】:

此答案是the OPa comment 的后续行动

为什么它不通过 prop_cycler 进一步循环?

原因是,即使prop_cycle 被松散地定义为axes 的属性(您使用plt.rcParams['axes.prop_cycle'] 检索它),实际上axes.bar 方法和axes.plot 方法,在初始化,实例化循环器的单独副本,因此,默认情况下(如 Matplotlib 3.4),条和线都从蓝色开始

In [15]: fig, ax = plt.subplots()
    ...: ax.bar((1,2,3), (5,4,6), label='b1')
    ...: ax.bar((1,2,3), (2,3,2), label='b2')
    ...: ax.plot((1,2,3),(9,6,8), label='l1')
    ...: ax.plot((1,2,3),(6,8,7), label='l2')
    ...: plt.legend()
    ...: plt.show()

当然,您可以显式指定每组不同条形或每条线的颜色,但如果您想混合相同的轴条和线,其颜色(以及可选的其他属性)遵循单个共享循环,您必须通过调用prop_cycle

来实例化一个适当的itertools.cycle对象
In [16]: fig, ax = plt.subplots()
    ...: pc = plt.rcParams['axes.prop_cycle']() # we CALL the prop_cycle
    ...: npc = lambda: next(pc)
    ...: ax.bar((1,2,3), (5,4,6), label='b1', **npc())
    ...: ax.bar((1,2,3), (2,3,2), label='b2', **npc())
    ...: ax.plot((1,2,3),(9,6,8), label='l1', **npc())
    ...: ax.plot((1,2,3),(6,8,7), label='l2', **npc())
    ...: plt.legend()
    ...: plt.show()

【讨论】:

以上是关于相同颜色和线条的条形图和线图在条形图后面的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib 将条形图和折线图结合在一起

为带有线条的条形图设置相应的颜色

java生成饼状图,条形图,折线图的技术可以动态的显示

Python制作带有辅助y轴的组合条形图和线图

R Shiny ggplot 条形图和折线图,具有动态变量选择和 y 轴为百分比

如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?