如何以子图的形式绘制数据框中的列 [英] How to plot columns from a dataframe, as subplots

查看:68
本文介绍了如何以子图的形式绘制数据框中的列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这里做错了什么?我想从 df 创建一个新的数据框,并使用Dates作为折线图中每个新创建的数据框(Emins,FTSE,Stoxx和Nikkei)的x轴。 / p>

我有一个名为 df 的数据框,它是从data.xlsx创建的,看起来像这样:

 日期ES1 Z 1 VG1 NK1 
0 2005-01-04 -0.0126 0.0077 -0.0030 0.0052
1 2005-01-05 -0.0065 -0.0057 0.0007- 0.0095
2 2005-01-06 0.0042 0.0017 0.0051 0.0044
3 2005-01-07 -0.0017 0.0061 0.0010 -0.0009
4 2005-01-11 -0.0065 -0.0040 -0.0147 0.0070
3670 2020-09-16 -0.0046 -0.0065 -0.0003 -0.0009
3671 2020-09-17 -0.0083 -0.0034 -0.0039 -0.0086
3672 2020-09-18 -0.0024 -0.0009 -0.0009 0.0052
3673 2020-09-23 -0.0206 0.0102 0.0022 -0.0013
3674 2020-09-24 0.0021 -0.0136 -0.0073 -0.0116

df 创建了4个新的数据框,分别称为Eminis,FTSE,Stoxx和Ni


感谢您的帮助!!

  import numpy as np 
import matplotlib.pyplot as plt
plt.style.use('classic')

df = pd.read_excel('data.xlsx')
df = df.rename(columns = {'Dates':'Date','ES1':'Eminis','Z 1':'FTSE','VG1':'Stoxx','NK1':'Nikkei', 'TY1':'Notes','G 1':'Gilts','RX1':'Bunds','JB1':'JGBS','CL1':'Oil','HG1':'Copper',' S 1':'Soybeans','GC1':'Gold','WILLTIPS':'TIPS'})
标头= df。列
Eminis = df [[''Date','Eminis' ]]
FTSE = df [[''Date','FTSE']]
Stoxx = df [['Date','Stoxx']]
Nikkei = df [['Date' ,'Nikkei']]

#通过plt.subplots(行,列)
图创建多个图,轴= plt.subplots(2,2,figsize =(20,15) )
x =日期
y1 = Eminis
y2 =票据
y3 = Stoxx
y4 =日经指数

#每个子图上有一个图b $ b轴[0] [0] .line(x,y1)
axes [0] [1] .line(x,y2)
axes [1] [0] .line(x,y3)
axes [1] [1] .line(x,y4)

plt.legends()
plt.show()


解决方案


  • 我认为更简洁的选择是不制作多个数据帧,这会造成不必要的工作和复杂性。

  • 绘制数据是关于为绘图API整形数据框

  • 在这种情况下,更好的选择是使用


    我在这里做什么错了?




      • Date 未定义为 x =日期

      • y2 =注释注释未定义

      • .line 不是 plt 方法,并导致 AttributeError ;应该是 plt.plot

      • y1-y4 是DataFrames,但是传递给y轴的plot方法,这会导致 TypeError:无法散列的类型:'numpy.ndarray';一栏应该作为 y 通过。

      • .legends 不是方法;它是 .legend

        • 如果需要的话,必须为每个子图显示图例。






      Eminis = df [[''Date','Eminis']] 
    FTSE = df [['Date','FTSE']]
    Stoxx = df [['Date','Stoxx']]
    Nikkei = df [['Date','Nikkei']]

    #通过plt.subplots(rows,columns)创建多个图
    图,轴= plt.subplots(2,2,figsize =(20,15))
    x = df日期
    y1 = Eminis.Eminis
    y2 = FTSE.FTSE
    y3 = Stoxx.Stoxx
    y4 = Nikkei.Nikkei

    #每个子图
    轴上有一个图[0] [0] .plot(x,y1, label ='Eminis')
    axis [0] [0] .legend()
    axes [0] [1] .plot(x,y2,label ='FTSE')
    axes [0] [1] .legend()
    轴[1] [0] .plot(x,y3,label ='Stoxx')
    轴[1] [0] .legend()
    轴[1] [1] .plot(x,y4,label ='Nikkei')
    轴[1] [1] .legend()

    plt.show( )


    What am I doing wrong here? I want to create for new dataframe from df and use Dates as the x-axis in a line chart for each newly created dataframe (Emins, FTSE, Stoxx and Nikkei).

    I have a dataframe called df that I created from data.xlsx and it looks like this:

        Dates         ES1     Z 1     VG1     NK1
    0   2005-01-04  -0.0126  0.0077 -0.0030  0.0052
    1   2005-01-05  -0.0065 -0.0057  0.0007 -0.0095
    2   2005-01-06   0.0042  0.0017  0.0051  0.0044
    3   2005-01-07  -0.0017  0.0061  0.0010 -0.0009
    4   2005-01-11  -0.0065 -0.0040 -0.0147  0.0070
    3670    2020-09-16  -0.0046 -0.0065 -0.0003 -0.0009
    3671    2020-09-17  -0.0083 -0.0034 -0.0039 -0.0086
    3672    2020-09-18  -0.0024 -0.0009 -0.0009  0.0052
    3673    2020-09-23  -0.0206  0.0102  0.0022 -0.0013
    3674    2020-09-24  0.0021  -0.0136 -0.0073 -0.0116
    

    From df I created 4 new dataframes called Eminis, FTSE, Stoxx and Nikkei.

    Thanks for your help!!!!

        import numpy as np
        import matplotlib.pyplot as plt
        plt.style.use('classic')
        
        df = pd.read_excel('data.xlsx')
        df = df.rename(columns={'Dates':'Date','ES1': 'Eminis', 'Z 1': 'FTSE','VG1': 'Stoxx','NK1': 'Nikkei','TY1': 'Notes','G 1': 'Gilts', 'RX1': 'Bunds','JB1': 'JGBS','CL1': 'Oil','HG1': 'Copper','S 1': 'Soybeans','GC1': 'Gold','WILLTIPS': 'TIPS'})
        headers = df.columns
        Eminis = df[['Date','Eminis']]
        FTSE = df[['Date','FTSE']]
        Stoxx = df[['Date','Stoxx']]
        Nikkei = df[['Date','Nikkei']]
        
        # create multiple plots via plt.subplots(rows,columns)
        fig, axes = plt.subplots(2,2, figsize=(20,15))
        x = Date
        y1 = Eminis
        y2 = Notes
        y3 = Stoxx
        y4 = Nikkei
        
        # one plot on each subplot
        axes[0][0].line(x,y1)
        axes[0][1].line(x,y2)
        axes[1][0].line(x,y3)
        axes[1][1].line(x,y4)
        
        plt.legends()
        plt.show()
    

    解决方案

    • I think the more succinct option is not to make many dataframes, which creates unnecessary work, and complexity.
    • Plotting data is about shaping the dataframe for the plot API
    • In this case, a better option is to convert the dataframe to a long (tidy) format, from a wide format, using .stack.
      • This places all the labels in one column, and the values in another column
    • Use seaborn.relplot, which can create a FacetGrid from a dataframe in a long format.
      • seaborn is a high-level API for matplotlib, and makes plotting much easier.
    • If the dataframe contains many stocks, but only a few are to be plotted, they can be selected with Boolean indexing

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # import data from excel, or setup test dataframe
    data = {'Dates': ['2005-01-04', '2005-01-05', '2005-01-06', '2005-01-07', '2005-01-11', '2020-09-16', '2020-09-17', '2020-09-18', '2020-09-23', '2020-09-24'],
            'ES1': [-0.0126, -0.0065, 0.0042, -0.0017, -0.0065, -0.0046, -0.0083, -0.0024, -0.0206, 0.0021],
            'Z 1': [0.0077, -0.0057, 0.0017, 0.0061, -0.004, -0.0065, -0.0034, -0.0009, 0.0102, -0.0136],
            'VG1': [-0.003, 0.0007, 0.0051, 0.001, -0.0147, -0.0003, -0.0039, -0.0009, 0.0022, -0.0073],
            'NK1': [0.0052, -0.0095, 0.0044, -0.0009, 0.007, -0.0009, -0.0086, 0.0052, -0.0013, -0.0116]}
    
    df = pd.DataFrame(data)
    
    # rename columns
    df = df.rename(columns={'Dates':'Date','ES1': 'Eminis', 'Z 1': 'FTSE','VG1': 'Stoxx','NK1': 'Nikkei'})
    
    # set Date to a datetime
    df.Date = pd.to_datetime(df.Date)
    
    # set Date as the index
    df.set_index('Date', inplace=True)
    
    # stack the dataframe
    dfs = df.stack().reset_index().rename(columns={'level_1': 'Stock', 0: 'val'})
    
    # to select only a subset of values from Stock, to plot, select them with Boolean indexing
    df_select = dfs[dfs.Stock.isin(['Eminis', 'FTSE', 'Stoxx', 'Nikkei'])]`
    
    # df_select.head()
            Date   Stock     val
    0 2005-01-04  Eminis -0.0126
    1 2005-01-04    FTSE  0.0077
    2 2005-01-04   Stoxx -0.0030
    3 2005-01-04  Nikkei  0.0052
    4 2005-01-05  Eminis -0.0065
    
    # plot
    sns.relplot(data=df_select, x='Date', y='val', col='Stock', col_wrap=2, kind='line')
    

    What am I doing wrong here?

    • The current implementation is inefficient, has a number of incorrect method calls, and undefined variables.
      • Date is not defined for x = Date
      • y2 = Notes: Notes is not defined
      • .line is not a plt method and causes an AttributeError; it should be plt.plot
      • y1 - y4 are DataFrames, but passed to the plot method for the y-axis, which causes TypeError: unhashable type: 'numpy.ndarray'; one column should be passes as y.
      • .legends is not a method; it's .legend
        • The legend must be shown for each subplot, if one is desired.

    Eminis = df[['Date','Eminis']]
    FTSE = df[['Date','FTSE']]
    Stoxx = df[['Date','Stoxx']]
    Nikkei = df[['Date','Nikkei']]
    
    # create multiple plots via plt.subplots(rows,columns)
    fig, axes = plt.subplots(2,2, figsize=(20,15))
    x = df.Date
    y1 = Eminis.Eminis
    y2 = FTSE.FTSE
    y3 = Stoxx.Stoxx
    y4 = Nikkei.Nikkei
    
    # one plot on each subplot
    axes[0][0].plot(x,y1, label='Eminis')
    axes[0][0].legend()
    axes[0][1].plot(x,y2, label='FTSE')
    axes[0][1].legend()
    axes[1][0].plot(x,y3, label='Stoxx')
    axes[1][0].legend()
    axes[1][1].plot(x,y4, label='Nikkei')
    axes[1][1].legend()
    
    plt.show()
    

    这篇关于如何以子图的形式绘制数据框中的列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆