gpt4 book ai didi

python - 在 matplotlib 子图中放大绘图

转载 作者:行者123 更新时间:2023-12-04 12:21:33 24 4
gpt4 key购买 nike

这个问题是从这个教程中发现的here :
我希望我的图看起来像下面的图,但时间序列数据和缩放数据不是 x_lim , y_lim数据,但来自不同的来源。
enter image description here
所以在上面的图中,我想要来自不同来源的日内数据,下面的图是一些股票的每日数据。但是因为它们都有不同的来源,所以我不能使用限制来缩放。为此,我将在日内使用 yahoo datareader,在日内使用 yfinance。
编码:

import pandas as pd
from pandas_datareader import data as web
from matplotlib.patches import ConnectionPatch

df = web.DataReader('goog', 'yahoo')
df.Close = pd.to_numeric(df['Close'], errors='coerce')

fig = plt.figure(figsize=(6, 5))
plt.subplots_adjust(bottom = 0., left = 0, top = 1., right = 1)
sub1 = fig.add_subplot(2,2,1)
sub1 = df.Close.plot()

sub2 = fig.add_subplot(2,1,2) # two rows, two columns, second cell
df.Close.pct_change().plot(ax =sub2)
sub2.plot(theta, y, color = 'orange')
con1 = ConnectionPatch(xyA=(df[1:2].index, df[2:3].Close), coordsA=sub1.transData,
xyB=(df[4:5].index, df[5:6].Close), coordsB=sub2.transData, color = 'green')
fig.add_artist(con1)
我在使用 xy 坐标时遇到问题。使用上面的代码,我得到:

TypeError: Cannot cast array data from dtype('O') to dtype('float64')according to the rule 'safe'

xyA=(df[1:2].index, df[2:3].Close)
我在这里所做的是我的 xvalue 是日期 df[1:2].index我的 y 值是价格 df[2:3].Close enter image description here
是将 df 转换为数组,然后在此处绘制我唯一的选择吗?如果有任何其他方法可以获得 ConnectionPatch善待工作,请指教。
df.dtypes

High float64
Low float64
Open float64
Close float64
Volume int64
Adj Close float64
dtype: object

最佳答案

绘制 matplotlib 日期的方式是将日期转换为浮点数作为天数,从 1970-1-1 的 0 开始,即 POSIX 时间戳零。它与那个时间戳不同,因为它不是相同的分辨率,即“1”是一天而不是一秒。
有 3 种方法可以计算该数字,

  • 要么使用 matplotlib.dates.date2num
  • 或使用 .toordinal()它为您提供正确的分辨率并删除对应于 1970-1-1、
  • 的偏移量
  • 或获取 POSIX 时间戳并除以一天中的秒数:
  • df['Close'] = pd.to_numeric(df['Close'], errors='coerce')
    df['Change'] = df['Close'].pct_change()

    con1 = ConnectionPatch(xyA=(df.index[0].toordinal() - pd.Timestamp(0).toordinal(), df['Close'].iloc[0]), coordsA=sub1.transData,
    xyB=(df.index[1].toordinal() - pd.Timestamp(0).toordinal(), df['Change'].iloc[1]), coordsB=sub2.transData, color='green')
    fig.add_artist(con1)

    con2 = ConnectionPatch(xyA=(df.index[-1].timestamp() / 86_400, df['Close'].iloc[-1]), coordsA=sub1.transData,
    xyB=(df.index[-1].timestamp() / 86_400, df['Change'].iloc[-1]), coordsB=sub2.transData, color='green')
    fig.add_artist(con2)
    您还需要确保您使用的是目标轴范围内的值,在您的示例中,您使用 Close sub2 上的值包含 pct_change 'd 值。
    当然,如果您想要像示例中那样的框底部,则使用轴变换而不是数据变换来表示坐标会更容易:
    from matplotlib.dates import date2num

    con1 = ConnectionPatch(xyA=(0, 0), coordsA=sub1.transAxes,
    xyB=(date2num(df.index[1]), df['Change'].iloc[1]), coordsB=sub2.transData, color='green')
    fig.add_artist(con1)

    con2 = ConnectionPatch(xyA=(1, 0), coordsA=sub1.transAxes,
    xyB=(date2num(df.index[-1]), df['Change'].iloc[-1]), coordsB=sub2.transData, color='green')
    fig.add_artist(con2)
    要绘制烛台,我建议使用 mplfinance (以前是 matplotlib.finance)包:
    import mplfinance as mpf
    sub3 = fig.add_subplot(2, 2, 2)
    mpf.plot(df.iloc[30:70], type='candle', ax=sub3)

    将所有这些放在一个脚本中,它可能如下所示:
    import pandas as pd, mplfinance as mpf, matplotlib.pyplot as plt
    from pandas_datareader import data as web
    from matplotlib.patches import ConnectionPatch
    from matplotlib.dates import date2num, ConciseDateFormatter, AutoDateLocator
    from matplotlib.ticker import PercentFormatter

    # Get / compute data
    df = web.DataReader('goog', 'yahoo')
    df['Close'] = pd.to_numeric(df['Close'], errors='coerce')
    df['Change'] = df['Close'].pct_change()

    # Pick zoom range
    zoom_start = df.index[30]
    zoom_end = df.index[30 + 8 * 5] # 8 weeks ~ 2 months

    # Create figures / axes
    fig = plt.figure(figsize=(18, 12))
    top_left = fig.add_subplot(2, 2, 1)
    top_right = fig.add_subplot(2, 2, 2)
    bottom = fig.add_subplot(2, 1, 2)
    fig.subplots_adjust(hspace=.35)

    # Plot all 3 data
    df['Close'].plot(ax=bottom, linewidth=1, rot=0, title='Daily closing value', color='purple')
    bottom.set_ylim(0)

    df.loc[zoom_start:zoom_end, 'Change'].plot(ax=top_left, linewidth=1, rot=0, title='Daily Change, zoomed')
    top_left.yaxis.set_major_formatter(PercentFormatter())

    # Here instead of df.loc[...] use your intra-day data
    mpf.plot(df.loc[zoom_start:zoom_end], type='candle', ax=top_right, xrotation=0, show_nontrading=True)
    top_right.set_title('Last day OHLC')

    # Put ConciseDateFormatters on all x-axes for fancy date display
    for ax in fig.axes:
    locator = AutoDateLocator()
    ax.xaxis.set_major_locator(locator)
    ax.xaxis.set_major_formatter(ConciseDateFormatter(locator))

    # Add the connection patches
    fig.add_artist(ConnectionPatch(
    xyA=(0, 0), coordsA=top_left.transAxes,
    xyB=(date2num(zoom_start), df.loc[zoom_start, 'Close']), coordsB=bottom.transData,
    color='green'
    ))

    fig.add_artist(ConnectionPatch(
    xyA=(1, 0), coordsA=top_left.transAxes,
    xyB=(date2num(zoom_end), df.loc[zoom_end, 'Close']), coordsB=bottom.transData,
    color='green'
    ))

    plt.show()
    enter image description here

    关于python - 在 matplotlib 子图中放大绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69124977/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com