【问题标题】:Python making combined bar and line plot with secondary y-axisPython制作带有辅助y轴的组合条形图和线图
【发布时间】:2017-08-06 10:27:27
【问题描述】:

我正在尝试绘制一些 csv 数据。我想绘制一些 csv 数据。数据如下所示。我正在尝试将第 1-11 列绘制为条形图,将第 12 列绘制为一条线。我可以使用以下代码分别制作这两个图,但是如何组合这些图并且还有一个辅助 y 轴?

这是我正在绘制的数据示例

DateTime    e1      e2       e3      e4      e5     e6      e7      e8      e9       e10      e11    p12
11/1/2014   1772    1926    1852    1513    1713    1568    1721    1822    1665    1449    1874    347
11/2/2014   19884   20365   19799   18017   18394   19383   20089   19929   20277   19522   19882   3710
11/3/2014   28697   29692   28881   25031   26731   28207   29095   29109   29577   28714   28926   5614
11/4/2014   24906   26061   25174   21745   23623   24126   24954   25344   25679   24406   25288   4990
11/5/2014   9059    9821    9116    7546    8742    8530    8910    9372    9214    8227    9366    1734
11/6/2014   1396    1691    1569    1176    1353    1223    1347    1541    1355    1044    1580    282
11/7/2014   10039   10416   9902    8223    9667    9511    9877    10106   10180   9524    10138   1857
11/8/2014   26746   27694   27128   23694   25520   26351   27176   27155   27704   26979   26995   5155
11/9/2014   14797   15567   14818   13556   14499   14244   14899   14979   15225   14171   14929   2846
11/10/2014  26059   27443   26573   22844   24655   25538   26658   26690   27303   26094   26471   5304

这是我用来分别绘制它们的代码

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data.csv", index_col="DateTime", parse_dates=True)
df.iloc[:,[0,1,2,3,4,5,6,7,8,9,10]].plot(kind='bar')
df.iloc[:,11].plot(linestyle='-', marker='o')
plt.show()

【问题讨论】:

    标签: python python-3.x pandas matplotlib


    【解决方案1】:

    您只需将它们绘制在同一轴上

    ax = df.iloc[:,[0,1,2,3,4,5,6,7,8,9,10]].plot(kind='bar')
    df.iloc[:,12].plot(linestyle='-', marker='o', ax = ax)
    
    ax.set_xticklabels(df.DateTime, rotation=40) #set the x-ticks to datetime column and rotate
    

    是我用来在同一个图上绘制两个图的代码

    【讨论】:

    • 嗯,这只是给了我第 11 列的情节。
    • 我在回答之前尝试了这个情节,它给出了条形图和线条图
    • @A-Z 你使用问题中提供的DataFrame了吗?
    • 是的,使用相同的数据框。我将发布情节的图像
    • 我仍然只得到一个情节。你能发布你使用的代码吗?
    【解决方案2】:

    不幸的是,在 pandas 如果 x 轴是日期轴,在相同的轴上绘制条形图和线图似乎是不可能的。

    一种解决方法是改用 matplotlib 条形图

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv("data.csv", index_col="DateTime", parse_dates=True, delim_whitespace=True)
    
    fig, ax= plt.subplots()
    
    ax.plot_date(df.index, df.iloc[:,11], '-')
    for i in range(10):
        diff = df.index[1]-df.index[0]
        spacing = diff/(1.3*len(df.columns))
        ax.bar(df.index+(-5+i)*spacing, df.iloc[:,i], 
               width=spacing/diff, label=df.columns[i]) 
    plt.legend()
    plt.gcf().autofmt_xdate()
    plt.show()
    

    编辑:

    如果我们忽略点是日期这一事实,则可以在同一轴上绘制条形图和折线图。在下面的代码中,我们确实不将第一列作为索引读取

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv("data.csv", parse_dates=True, delim_whitespace=True)
    
    ax = df.iloc[:,[0,1,2,3,4,5,6,7,8,9,10,11]].plot(kind='bar')
    df.iloc[:,12].plot(linestyle='-', marker='o', ax = ax)
    
    ax.set_xticklabels(df.DateTime, rotation=40) 
    plt.show()
    

    因此,此方法将生成一个图表,其中条形图和线点仅按其索引排序(不是日期)。这取决于日期是否等距

    如果我们例如将输入文件更改为跳过日期(不存在 2014 年 11 月 6 日),代码将生成

    虽然实际日期并非如此,但条形和线点仍然等距分布。

    从我们得到的答案开始,用 matplotlib 代码跳过一天绘制相同的数据

    2014 年 11 月 6 日确实不见了。

    【讨论】:

    • 这行得通,但你能向我解释一下“(10.+3)”的作用吗?谢谢。
    • 我编辑了代码,使其更清楚 (10+3) 应该意味着用 (1.3*n) 替换它,其中 n 是要绘制的列数。我还发现了 @A-Za-z 中的代码为何有效,并在我的答案中添加了解释。
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2019-05-24
    • 2021-05-04
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多