<ul>
<li>从图中可以看出,问题是前3行是针对dataframe索引绘制的,它以<code>tuple</code>的形式显示。散点图是根据<code>datetime</code>值<code>x</code>绘制的,该值不是<code>ax</code>轴上的值,因此它们绘制在最右侧。
<ul>
<li><a href="https://i.stack.imgur.com/Exzzp.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Exzzp.png" alt="enter image description here"/></a></li>
<li><a href="https://i.stack.imgur.com/EfoOx.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/EfoOx.png" alt="enter image description here"/></a>-轴是一堆堆叠的<code>tuples</code>,如<a href="https://i.stack.imgur.com/aXspw.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/aXspw.png" alt="enter image description here"/></a></li>
</ul>
</li>
<li>不要将数据帧转换为多索引<strong>如果您正在执行某项操作,这将创建多索引,那么执行<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html" rel="nofollow noreferrer">^{<cd6>}</a>,其中<code>x</code>表示<code>'symbol'</code>在多索引中的级别。
<ul>
<li>从索引中删除<code>'symbol'</code>后,使用<code>df.index = pd.to_datetime(df.index).date</code>将<code>'date'</code>转换为<code>datetime dtype</code></li>
</ul>
</li>
<li>据推测,数据帧中有不止一个唯一的<code>'symbol'</code>,因此应该为每个数据帧绘制一个单独的图</李>
<li><strong>在<code>pandas 1.3.1</code>、<code>python 3.8</code>和<code>matplotlib 3.4.2</code></strong></li>
</ul>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# load the data from the csv
df = pd.read_csv('file.csv')
# convert date to a datetime format and extract only the date component
df.date = pd.to_datetime(df.date).dt.date
# set date as the index
df.set_index('date', inplace=True)
# this is what the dataframe should look like before plotting
symbol close high low open volume adjClose adjHigh adjLow adjOpen adjVolume divCash splitFactor ma5 ma100 buy sell
date
2020-01-01 601398 5.88 5.88 5.88 5.88 0 5.30 5.30 5.30 5.30 0 0.0 1.0 NaN NaN NaN NaN
2020-01-02 601398 5.97 6.03 5.91 5.92 234949400 5.38 5.43 5.33 5.34 234949400 0.0 1.0 NaN NaN NaN NaN
2020-01-03 601398 5.99 6.02 5.96 5.97 152213050 5.40 5.43 5.37 5.38 152213050 0.0 1.0 NaN NaN NaN NaN
2020-01-06 601398 5.97 6.05 5.95 5.96 226509710 5.38 5.45 5.36 5.37 226509710 0.0 1.0 NaN NaN NaN NaN
# extract the unique symbols
symbols = df.symbol.unique()
# get the number of unique symbols
sym_len = len(symbols)
# create a number of subplots based on the number of unique symbols in df
fig, axes = plt.subplots(nrows=sym_len, ncols=1, figsize=(12, 4*sym_len))
# if there's only 1 symbol, axes won't be iterable, so we put it in a list
if type(axes) != np.ndarray:
axes = [axes]
# iterate through each symbol and plot the relevant data to an axes
for ax, sym in zip(axes, symbols):
# select the data for the relevant symbol
data = df[df.symbol.eq(sym)]
# plot data
data[['adjClose', 'ma5', 'ma100']].plot(ax=ax, title=f'Data for Symbol: {sym}', ylabel='Value')
ax.scatter(data.index, y=data['buy'], label='buy', marker='^', color='red')
ax.scatter(data.index, y=data['sell'], label='sell', marker='v', color='green')
ax.legend(bbox_to_anchor=(1, 1.02), loc='upper left')
fig.tight_layout()
</code></pre>
<ul>
<li><code>data.high</code>和{<cd18>}是为散点图绘制的,因为{<cd19>}和{<cd20>}在测试数据中是{<cd21>}</李>
</ul>
<p><a href="https://i.stack.imgur.com/ubH7O.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ubH7O.png" alt="enter image description here"/></a></p>
<ul>
<li><code>df</code>可以通过以下方式方便地创建:</li>
</ul>
<pre class="lang-py prettyprint-override"><code>sample = {'symbol': [601398, 601398, 601398, 601398], 'date': ['2020-01-01 00:00:00+00:00', '2020-01-02 00:00:00+00:00', '2020-01-03 00:00:00+00:00', '2020-01-06 00:00:00+00:00'], 'close': [5.88, 5.97, 5.99, 5.97], 'high': [5.88, 6.03, 6.02, 6.05], 'low': [5.88, 5.91, 5.96, 5.95], 'open': [5.88, 5.92, 5.97, 5.96], 'volume': [0, 234949400, 152213050, 226509710], 'adjClose': [5.2991971571, 5.3803073177, 5.3983317978, 5.3803073177], 'adjHigh': [5.2991971571, 5.4343807581, 5.425368518, 5.4524052382], 'adjLow': [5.2991971571, 5.3262338773, 5.3712950777, 5.3622828376], 'adjOpen': [5.2991971571, 5.3352461174, 5.3803073177, 5.3712950777], 'adjVolume': [0, 234949400, 152213050, 226509710], 'divCash': [0.0, 0.0, 0.0, 0.0], 'splitFactor': [1.0, 1.0, 1.0, 1.0], 'ma5': [np.nan, np.nan, np.nan, np.nan], 'ma100': [np.nan, np.nan, np.nan, np.nan], 'buy': [np.nan, np.nan, np.nan, np.nan], 'sell': [np.nan, np.nan, np.nan, np.nan]}
df = pd.DataFrame(sample)
</code></pre>