Matplotlib在x轴上绘制了多条暗色线。

3
以下是相关问题的情节。深色线条覆盖了x轴,但由于某种原因,我无法调试此问题。我正在尝试绘制来自数据框的两列,即代码中可以看到的时间对3期SMA价格的图表。

Figure 1

这是代码的结果

import datetime

import matplotlib.pyplot as plt
import pandas as pd
from binance.client import Client

BASE = "ETH"
QUOTE = "USDT"
MARKET = BASE + QUOTE

client = Client("vitalik",
                "buterin")

klines = client.get_historical_klines(MARKET, Client.KLINE_INTERVAL_15MINUTE, "31 Dec, 2017", "13 Jan, 2018")

# temporary fix

for kline in klines:
    kline[0] = datetime.datetime.fromtimestamp(
        int(kline[0] / 1000)
    ).strftime('%Y-%m-%d %H:%M:%S')
    kline[6] = datetime.datetime.fromtimestamp(
        int(kline[6] / 1000)
    ).strftime('%Y-%m-%d %H:%M:%S')

df = pd.DataFrame(klines,
                  columns=["open_time", "open", "high", "low", "close", "volume", "close_time", "quote_asset_volume",
                           "trades", "base_volume", "quote_volume", "ignore"])

df['sma_3'] = df["close"].rolling(window=3).mean()

print(df.dtypes)

fig, ax = plt.subplots(figsize=(10, 6))
ax.xaxis_date()

plt.xticks(rotation=90)
plt.xlabel("Date")
plt.ylabel("Price")
plt.title(MARKET)
plt.plot_date(x=df["close_time"], y=df["sma_3"], fmt="r-")
plt.show()

print(df.dtypes)的结果是:

open_time              object
open                   object
high                   object
low                    object
close                  object
volume                 object
close_time             object
quote_asset_volume     object
trades                  int64
base_volume            object
quote_volume           object
ignore                 object
sma_5                 float64
sma_3                 float64
dtype: object

任何帮助都将不胜感激。谢谢。
2个回答

4

我认为有太多的 x 轴标签,需要将它们设置为不可见:

spacing = 10
visible = ax.xaxis.get_ticklabels()[::spacing]
for label in ax.xaxis.get_ticklabels():
    if label not in visible:
        label.set_visible(False)

plt.show()

这将如何帮助正常的x轴和y轴数组?我认为这个hack是针对上面的代码特定的。除此之外,您能否告诉其他解决此问题的方法? - babygame0ver
@babygame0ver - 我认为是的,只需将“spacing”更改为像“2”这样的小数字。 - jezrael
我正在使用get_ticklabels()函数在x轴列表上,但它显示AttributeError,因为列表不支持任何函数。那么现在该怎么办? - babygame0ver
@babygame0ver - print(ax.xaxis.get_ticklabels()) 返回什么? - jezrael
我没有像上面的代码中使用subplot函数。我有一个包含2000个值的x轴列表和y轴列表。当我绘制它们时,会出现与上面图片相同的问题。顺便说一下,x轴的值范围是1-2000,y轴的值范围是0.1-0.9,这样你就可以理解了。 - babygame0ver
1
@babygame0ver - 嗯,不知道。也许最好的方法是创建一个新问题。 - jezrael

2
您正在使用字符串作为x轴上的数量进行绘图。因此,每个点都将获得自己的标签。所有这些标签的累积看起来像“黑线”。
为了正确标记,您需要使用datetime对象进行绘图,而不是字符串。
我无法测试,因为我没有可用的binance,但最简单的选择可能只是在数据生成中删除.strftime('%Y-%m-%d %H:%M:%S')部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接