【问题标题】:How to plot charts side by side with a forloop如何使用 for 循环并排绘制图表
【发布时间】:2020-05-06 20:30:41
【问题描述】:

我有以下代码:

import pandas as pd
from pandas import datetime
from pandas import DataFrame as df
import matplotlib
from pandas_datareader import data as web
import matplotlib.pyplot as plt
import datetime
import numpy as np

stocks = 'GE','F' #<-- In this case there are just 2 symbols but this could be more 
start = datetime.date(2000,1,1)
end = datetime.date.today()

data = web.DataReader(stock, 'yahoo',start, end)

for stock in stocks:
    data.plot(y='Close')
plt.subplot(1,1,2) #<-- Trouble here

这是我的问题。如何在 forloop 中并排绘制所有符号?

【问题讨论】:

    标签: python-3.x pandas matplotlib


    【解决方案1】:

    像这样指定plt.subplots()的行数和列数:

    stocks = ['GE','F']
    fig,ax = plt.subplots(1,len(stocks))
    

    并像这样绘制每个子图:

    for i,stock in enumerate(stocks): 
        data = web.DataReader(stock,'yahoo',start,end) 
        ax[i].plot(data.index,data['Close']) 
    

    结果:

    【讨论】:

    • 感谢您的详细解答。绘制的图表被压缩在 1 个网格块中,也就是说,本来应该有 1 个图表的地方,2 个被压缩。是否可以并排绘制它们,但每个图将只占用 1 的空间而不是空间正在分裂?
    • 可以使用figsize参数:plt.figure(figsize=[width, height])指定整个figure的大小。
    【解决方案2】:

    你可以拿上面的代码,指定figsize参数。

    fig, ax = plt.subplots(1, len(stocks), figsize=(20, 10))
    

    如果您希望所有图都在同一行,只需修改figsize 的第一个参数,即包含子图的框的横轴长度。

    例如,如果您希望每个图都是 10x10 :

    fig, ax = plt.subplots(1, len(stocks), figsize=(len(stocks)*10, 10))
    

    【讨论】:

      【解决方案3】:

      这里我使用了数据框的绘图功能,我也喜欢用不同的颜色绘制,所以我做了这个小技巧。

      #CODE
      import pandas as pd
      from pandas import datetime
      from pandas import DataFrame as df
      import matplotlib
      from pandas_datareader import data as web
      import matplotlib.pyplot as plt
      import datetime
      import numpy as np
      
      colors = ["b",'g','r','c','m','y','k']
      
      stocks = 'GE','F' #<-- In this case there are just 2 symbols but this could be more 
      start = datetime.date(2000,1,1)
      end = datetime.date.today()
      
      data = web.DataReader(stocks, 'yahoo',start, end)
      
      # THIS MAKES A GRID OF 1 ROW and len(stocks) COLUMN and figure size as (width, height) in inches.
      fig, axs = plt.subplots(1, len(stocks), figsize=(30, 5))
      i = 0
      
      #iterate for each stock
      for stock in stocks:
          # i'th close stock will plot on i'th axs (Note: Whatever be your grid)
          data["Close"][stock].plot(ax=axs[i],color=colors[i%len(colors)])
          i += 1
      
      #show plot
      plt.show()
      

      【讨论】:

        【解决方案4】:

        你几乎是正确的。您应该将 subplot 放在 for 循环中。

        n = 2 # number of stocks
        for i, stock in enumerate(stocks):
            data.plot(y='Close')
            plt.subplot(1,n,i+1)
        

        请注意,我们会遍历股票,但也会跟踪i 中的当前指数。我们使用该索引来决定将绘图放置在何处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多