【问题标题】:Plotting line plot on top of bar plot in Python / matplotlib from dataframe在数据框中的 Python / matplotlib 中的条形图顶部绘制线图
【发布时间】:2019-09-18 17:23:56
【问题描述】:

我正在尝试在 matplotlib 中的堆积条形图顶部绘制线图,但无法同时显示它们。

我已经通过从其他数据框和日期时间索引中提取各种信息来设置组合数据框。我试图在一组轴(ax1)上从活动列(LightlyActive, FairlyActive, VeryActive)和每个睡眠周期(wake, light, deep, rem)的分钟数中绘制一个堆积条形图。然后,我尝试将efficiency 列绘制为一组单独的轴 (ax2) 上的线图。

我无法同时显示堆积条形图和折线图。如果我第二个绘制条形图,那是唯一出现的。如果我首先绘制线图(活动和效率),那么这些是唯一出现的。似乎我第二次绘制的任何风格情节都掩盖了第一个情节。

            LightlyActive  FairlyActive  VeryActive  efficiency  wake  light   deep    rem
dateTime                                                                                  
2018-04-10            314            34         123        93.0  55.0  225.0   72.0   99.0
2018-04-11            253            22         102        96.0  44.0  260.0   50.0   72.0
2018-04-12            282            26          85        93.0  47.0  230.0   60.0   97.0
2018-04-13            292            35          29        96.0  43.0  205.0   81.0   85.0

fig, ax1 = plt.subplots(figsize = (10, 10))
temp_df[['LightlyActive', 'FairlyActive', 'VeryActive']].plot(kind = 'bar', stacked = True, ax = ax1)
ax2 = plt.twinx(ax = ax1)
temp_df[['wake', 'light', 'deep', 'rem']].plot(ax = ax1)
temp_df['efficiency'].plot(ax = ax2)
plt.show()

我想在单个图上显示活动水平('LightlyActive'、'FairlyActive'、'VeryActive')和睡眠周期('wake'、'light'、'deep'、'rem')的堆叠条形图') 在一组轴上,睡眠效率在第二组轴上。

编辑

我什至没有像 Trenton 在下面的编辑版本中那样显示它(指定为“由 Trenton M 编辑”)。紧随其后的 2 个图是为我显示的版本。

这是我目前得到的(由 Trenton M 编辑):

  • 注意圈出的区域。

【问题讨论】:

  • @ImportanceOfBeingErnest 这个问题更多是关于颜色而不是轴,如果我没看错的话

标签: python matplotlib


【解决方案1】:

想通了!通过将日期保留为一列(即将它们设置为索引),我可以绘制线图和条形图。然后我可以返回并相应地调整标签。

@ScottBoston 你的 x 轴告诉了我。感谢您对此进行调查。

date1 = pd.datetime(2018, 4, 10)
data = {'LightlyActive': [314, 253, 282, 292],
    'FairlyActive': [34, 22, 26, 35],
    'VeryActive': [123, 102, 85, 29],
    'efficiency': [93.0, 96.0, 93.0, 96.0],
    'wake': [55.0, 44.0, 47.0, 43.0],
    'light': [225.0, 260.0, 230.0, 205.0],
    'deep': [72.0, 50.0, 60.0, 81.0],
    'rem': [99.0, 72.0, 97.0, 85.0],
    'date': [date1 + pd.Timedelta(days = i) for i in range(4)]}
temp_df = pd.DataFrame(data)

fig, ax1 = plt.subplots(figsize = (10, 10))
ax2 = plt.twinx(ax = ax1)
temp_df[['LightlyActive', 'FairlyActive', 'VeryActive']].\
         plot(kind = 'bar', stacked = True, ax = ax1)
temp_df[['wake', 'light', 'deep', 'rem']].plot(ax = ax1, alpha = 0.5)
temp_df['efficiency'].plot(ax = ax2)
ax1.set_xticklabels(labels = temp_df['date'])
plt.show()

【讨论】:

    【解决方案2】:

    alpha怎么样?

    fig, ax1 = plt.subplots(figsize = (10, 10))
    temp_df[['LightlyActive', 'FairlyActive', 'VeryActive']].plot(kind = 'bar', stacked = True, ax = ax1, alpha=.3)
    ax2 = plt.twinx(ax = ax1)
    temp_df[['wake', 'light', 'deep', 'rem']].plot(ax = ax1, zorder=10)
    temp_df['efficiency'].plot(ax = ax2)
    plt.show()
    

    输出:

    【讨论】:

    • 我在 alpha 上搞砸了很多。好主意,但这也不起作用。我已经开始深入研究 matplotlib 参数以试图解决这个问题,因为它似乎对你和其他人都有效。关于参数中可能出现的问题有什么想法吗?
    • 我什至尝试卸载/重新安装 matplotlib 只是为了回到第 1 格而没有运气。
    • @JacobMiller 我正在生成您正在寻找的示例输出?
    • 你的例子是我正在寻找的正是,但我不能在我的个人生活中让它像这样绘制或工作电脑。即使从全新的控制台开始,我也创建了简化的数据框,复制并粘贴代码,但无法同时显示两个图。 @斯科特波士顿
    • import pandas as pd import numpy as np import datetime import matplotlib.pyplot as plt data = {'LightlyActive': [314, 253, 282, 292], 'FairlyActive': [34, 22, 26, 35], 'VeryActive': [123, 102, 85, 29], 'efficiency': [93.0, 96.0, 93.0, 96.0], 'wake': [55.0, 44.0, 47.0, 43.0], 'light': [225.0, 260.0, 230.0, 205.0], 'deep': [72.0, 50.0, 60.0, 81.0], 'rem': [99.0, 72.0, 97.0, 85.0]} date1 = pd.datetime(2018, 4, 10) date = [date1 + pd.Timedelta(days = i) for i in range(4)] temp_df = pd.DataFrame(data, index = date)
    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2022-11-10
    • 2017-09-28
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多