在同一张图表上将 Pandas DataFrame 绘制为 Bar 和 Line

Posted

技术标签:

【中文标题】在同一张图表上将 Pandas DataFrame 绘制为 Bar 和 Line【英文标题】:Plot Pandas DataFrame as Bar and Line on the same one chart 【发布时间】:2014-06-22 07:53:53 【问题描述】:

我正在尝试绘制一个图表,其中第 1 列和第 2 列数据为条形,然后为第 3 列数据绘制线叠加。

我已经尝试了以下代码,但这会创建 2 个单独的图表,但我希望这一切都在一个图表上。

left_2013 = pd.DataFrame('month': ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],
                     '2013_val': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 6])

right_2014 = pd.DataFrame('month': ['jan', 'feb'], '2014_val': [4, 5])

right_2014_target = pd.DataFrame('month': ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],
                                   '2014_target_val': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])


df_13_14 = pd.merge(left_2013, right_2014, how='outer')
df_13_14_target = pd.merge(df_13_14, right_2014_target, how='outer')
df_13_14_target[['month','2013_val','2014_val','2014_target_val']].head(12)

plt.figure()
df_13_14_target[['month','2014_target_val']].plot(x='month',linestyle='-', marker='o')
df_13_14_target[['month','2013_val','2014_val']].plot(x='month', kind='bar')

这是我目前得到的

【问题讨论】:

我设法使用以下代码 fig, ax = plt.subplots() df_13_14_target[['month','2014_target_val']].plot(x='month',ax= ax, linestyle='--', marker='o', color='r') df_13_14_target[['month','2013_val','2014_val']].plot(x='month',ax=ax, kind='bar') 但是关于如何使线图居中于条形上方的任何想法 【参考方案1】:

DataFrame 绘图方法返回 matplotlib AxesSubplotAxesSubplots 列表。 (例如,请参阅 the docs for plot 或 boxplot。)

然后您可以将相同的轴传递给下一个绘图方法(使用ax=ax)以在相同的轴上绘制:

ax = df_13_14_target[['month','2014_target_val']].plot(x='month',linestyle='-', marker='o')
df_13_14_target[['month','2013_val','2014_val']].plot(x='month', kind='bar', 
   ax=ax)

import pandas as pd
import matplotlib.pyplot as plt

left_2013 = pd.DataFrame(
    'month': ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep',
               'oct', 'nov', 'dec'],
     '2013_val': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 6])

right_2014 = pd.DataFrame('month': ['jan', 'feb'], '2014_val': [4, 5])

right_2014_target = pd.DataFrame(
    'month': ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep',
               'oct', 'nov', 'dec'],
     '2014_target_val': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])

df_13_14 = pd.merge(left_2013, right_2014, how='outer')
df_13_14_target = pd.merge(df_13_14, right_2014_target, how='outer')

ax = df_13_14_target[['month', '2014_target_val']].plot(
    x='month', linestyle='-', marker='o')
df_13_14_target[['month', '2013_val', '2014_val']].plot(x='month', kind='bar',
                                                        ax=ax)

plt.show()

【讨论】:

问题出在索引上。默认情况下, plot 方法设置 use_index=True 来定义 x 轴刻度标签。尝试设置use_index=False,你会得到预期的结果。 API here 有没有办法为线设置不同的轴?假设它具有标准化值,我想在右侧显示另一个 y 轴,限制为 (0, 1) 并让线跟随该轴 use_index=False 如果您的索引值在系列之间不相同,则可能会很危险... 这很酷,但如果索引是 DateTime 则不起作用,比如在绘图之前添加 df_13_14_target['month'] = pd.to_datetime(df_13_14_target['month'], format='%b')

以上是关于在同一张图表上将 Pandas DataFrame 绘制为 Bar 和 Line的主要内容,如果未能解决你的问题,请参考以下文章

pandas - DataFrame 写入同一张excel表

在同一页面上的多个图表上将vAxis设置为相同比例

Python:在多张工作表上将 Pandas DataFrame 写入 Excel 的最快方法

20200116(绘图和可视化——pandas)

绘图与可视化--pandas中的绘图函数

4000字,25张精美交互图表,开启Plotly Express之旅