簡體   English   中英

使用 Matplotlib 跳過 Python 中的某些值

[英]Skipping certain values in Python with Matplotlib

我目前正在使用 Alpha Vantage API 制作日內股票圖表。 數據框包含從 4:00 到 20:00 的值。 然而,在我的 matplotlib.pyplot 圖表中,x 軸還包括夜間 20:00 到 4:00 的值。 我不想要這個,因為它破壞了美學和體積子情節。

問:有什么方法可以跳過實際數據框中不存在的 x 軸值(從 20:00 到 04:00 的值)?

如您所見,Data Frame 明顯從 20:00 跳轉到 04:00

但是在 Matplotlib 圖表中,x 軸包含從 20:00 到 4:00 的值,與圖表混淆

代碼到此為止。 我相信到目前為止一切都是正確的:

import pandas as pd
import matplotlib.pyplot as plt
from alpha_vantage.timeseries import TimeSeries
import time
import datetime as dt
from datetime import timedelta as td 
from dateutil.relativedelta import relativedelta

#Accessing and Preparing API
ts = TimeSeries(key=api_key, output_format='pandas')

ticker_input = "TSLA"
interval_input = "15min"
df, meta_data = ts.get_intraday(symbol = ticker_input, interval = interval_input, outputsize = 'full')
slice_date = 16*4*5
df = df[0:slice_date]
df = df.iloc[::-1]
df["100ma"] = df["4. close"].rolling(window = 50, min_periods = 0).mean()
df["Close"] = df["4. close"]
df["Date"] = df.index

#Plotting all as 2 different subplots
ax1 = plt.subplot2grid((7,1), (0,0), rowspan = 5, colspan = 1)
ax1.plot(df["Date"], df['Close'])
ax1.plot(df["Date"], df["100ma"], linewidth = 0.5)
plt.xticks(rotation=45)
ax2 = plt.subplot2grid((6,1), (5,0), rowspan = 2, colspan = 2, sharex = ax1)
ax2.bar(df["Date"], df["5. volume"])
ax2.axes.xaxis.set_visible(False)
plt.tight_layout()
plt.show()

如果有人可以提供幫助,那就太好了。 我仍然是一個完整的初學者,兩周前才開始 Python。

我們從同一個地方獲取數據,盡管數據獲取方法不同。 在以 15 個單位提取后,我通過排除晚上 8 點之后和下午 4 點之前的數據創建了一個圖表。 我創建代碼的理解是您的跳過會打開暫停。 一旦設置了 NaN,您希望它跳過的內容就會被跳過。

import datetime
import pandas as pd
import numpy as np
import pandas_datareader.data as web
import mplfinance as mpf
# import matplotlib.pyplot as plt

with open('./alpha_vantage_api_key.txt') as f:
    api_key = f.read()

now_ = datetime.datetime.today()

start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(now_.year, now_.month, now_.day - 1)

symbol = 'TSLA'
df = web.DataReader(symbol, 'av-intraday', start, end, api_key=api_key)

df.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
df.index = pd.to_datetime(df.index)
df["100ma"] = df["Close"].rolling(window = 50, min_periods = 0).mean()
df["Date"] = df.index
df_15 = df.asfreq('15min')
df_15 = df_15[(df_15.index.hour >= 4)&(df_15.index.hour <= 20) ]

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,4.5),dpi=144)

#Plotting all as 2 different subplots
ax1 = plt.subplot2grid((7,1), (0,0), rowspan = 5, colspan = 1)
ax1.plot(df_15["Date"], df_15['Close'])
ax1.plot(df_15["Date"], df_15["100ma"], linewidth = 0.5)
plt.xticks(rotation=20)

ax2 = plt.subplot2grid((6,1), (5,0), rowspan = 2, colspan = 2, sharex = ax1)
ax2.bar(df_15["Date"], df_15["Volume"])
ax2.axes.xaxis.set_visible(False)
# plt.tight_layout()
plt.show()

在此處輸入圖像描述

我使用 matplotlib.ticker.formatter 修復了它。

我首先創建了一個 class 並使用:

class MyFormatter(Formatter):
    def __init__(self, dates, fmt='%Y-%m-%d %H:%M'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        'Return the label for time x at position pos'
        ind = int(np.round(x))
    if ind >= len(self.dates) or ind < 0:
        return ''
    return self.dates[ind].strftime(self.fmt)

formatter = MyFormatter(df.index)
ax1 = plt.subplot2grid((7,1), (0,0), rowspan = 5, colspan = 1)
ax1.xaxis.set_major_formatter(formatter)
ax1.plot(np.arange(len(df)), df["Close"])
ax1.plot(np.arange(len(df)), df["100ma"], linewidth = 0.5)
ax1.xticks(rotation=45)
ax1.axis([xmin,xmax,ymin,ymax])
ax2 = plt.subplot2grid((6,1), (5,0), rowspan = 2, colspan = 2, sharex = ax1)
ax2.bar(np.arange(len(df)), df["5. volume"])

plt.show()

這給了我一個比以前更平滑的圖表,也是 r-beginner 推薦的。 這是結果

我唯一的問題是,如果我放大 x 軸並沒有真正改變。 它總是有年份、月份、日期、小時和分鍾。 顯然,當我進一步放大時,我只想要小時和分鍾。 我還沒有弄清楚如何做到這一點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM