为什么 plt.grid 函数为我绘制的数据设置了一个完整的灰色背景,而不是仅仅设置一些网格线? Python 相关

Why is the plt.grid function setting a complete grey background for my plotted data instead of just setting some grid lines? Python related

我开始学习数据科学,我被教导可以使用 matplotlib.pyplot 来绘制我的数据。这是其中的一些预览(1 小时时间范围内的 OHLC 价格):

还有用于调试目的的 SOLUSDT_close.head().to_dict() 的输出:

{'Close Price': {'2021-06-29 00:59:59.999': 33.65642566,
  '2021-06-29 01:59:59.999': 33.309,
  '2021-06-29 02:59:59.999': 32.76168975,
  '2021-06-29 03:59:59.999': 33.118,
  '2021-06-29 04:59:59.999': 33.267}}

所以,我只对绘制 Close PriceEnd Date 感兴趣,为此我编写了以下代码:

import pandas as pd
import matplotlib.pyplot as plt

# Import the csv file without index
SOLUSDT = pd.read_csv('C:/Users/ResetStoreX/Downloads/Binance futures data/SolUSDT-Mark_Prices_Klines_1h_Timeframe/zip/SOLUSDT-1h-June-29-2021-February-13-2022.csv', index_col=0)

# Create a new df that only contains the date and close price from the previous imported df
SOLUSDT_close = SOLUSDT[['End Date','Close Price']]

# Set the 'Date' column as the actual index
SOLUSDT_close.set_index('End Date', inplace=True) 

# set the breadth and length of the plot as a good mix of values
plt.figure(figsize=(14,5))

# set a grid background to the plot
plt.grid(True) 

# set the color of the trend as blue
plt.plot(SOLUSDT_close, 'b')

# give a title to the plot
plt.title('SOLUSDT close price from June 29 2021 to February 13 2022')

# give a label to the x axis
plt.xlabel('Date')

# gove a label to the y axis
plt.ylabel('Close Price')

# plot it
plt.plot(SOLUSDT_close)

然而,我得到的结果令人失望:

可以看出,网格线与灰色背景合并,并且它也没有在 x 轴上显示一些预期的结束日期值。

如果我决定再次删除 plt.grid(True) 语句和 运行 代码,它最终会绘制以下图表:

我想要实现的是绘制一张来自 CoinGecko 的图表(显然忽略了交易量,但显示了网格线和一些主要日期):

我可以在这里得到一些帮助吗?

这里唯一的问题是您的日期太多,而且每个日期都在 x-axis 上画线。一种方法是在 grid 函数中使用关键字 axis

plt.grid(True, axis='y')

另一个是仅 select 某些您想要放在 x-axis 上的时间(日期) - 如您现在所见,它们太多了。此外,不需要第二行绘图。这将是一个非常快速和肮脏的例子,但你明白了:

import pandas as pd
import matplotlib.pyplot as plt

df= pd.read_csv('./sol-usd-max.csv', usecols=['snapped_at','price'])

df.set_index('snapped_at', inplace=True) 

# set the breadth and length of the plot as a good mix of values
plt.figure(figsize=(14,5))

# set a grid background to the plot
plt.grid(True, axis='y')
plt.grid(True, axis='x', which='major')

# set the color of the trend as blue
plt.plot(df[::10], 'b')

# give a title to the plot
plt.title('SOLUSDT close price from June 29 2021 to February 13 2022')

# give a label to the x-axis
plt.xlabel('Date')

# give a label to the y axis
plt.ylabel('Close Price')


更新

至于错误的日期时间格式,将其转换为日期时间(通过将其加载为日期时间或使用 df["snapped_at"] = pd.to_datetime(df["snapped_at"]) 转换)也解决了问题:

import pandas as pd
import matplotlib.pyplot as plt

df= pd.read_csv('./sol-usd-max.csv', usecols=['snapped_at','price'], parse_dates=["snapped_at"])

# df.set_index('snapped_at', inplace=True) 

# set the breadth and length of the plot as a good mix of values
plt.figure(figsize=(14,5))

# set a grid background to the plot
plt.grid(True)

# set the color of the trend as blue
plt.plot(df["snapped_at"], df["price"], c='b')

# give a title to the plot
plt.title('SOLUSDT close price from June 29 2021 to February 13 2022')

# give a label to the x axis
plt.xlabel('Date')

# give a label to the y axis
plt.ylabel('Close Price')

但这不是问题的主要关注点。我的意思是,如果数据类型正确就不会发生,但它不会直接导致背景变灰。