使用Plotly绘制的Python图表中Y轴数值无序

7
我正在使用AlphaVantage API下载数据点,然后将其转换为pandas DataFrame。
我想使用Plotly绘制新的DataFrame散点/折线图。 当在Google Colab中绘制它们时,图形似乎完美,但是在PyCharm和Jupiter Notebook中无法复制结果。
在PyCharm和JN中绘图时,Y轴值以错误顺序绘制,就像图形试图创建尽可能直的线一样(请查看第2张图片并仔细查看y轴)。
以下是代码和图表的简化示例:
两个实例中使用完全相同的代码
期望结果(来自Colab的样本): Sample from Colab 在PyCharm和JN上的结果(当前问题图): Current Issue Graph 请参见代码:
import requests
import pandas as pd
import plotly.graph_objects as go


# DATA FROM API
response = requests.get(url='https://www.alphavantage.co/query?function=TIME_SERIES_WEEKLY&symbol=IBM&apikey=demo')
response.raise_for_status()
stock_weekly = response.json()['Weekly Time Series']


# CHANGE DATA FORMAT, RENAME COLUMNS AND CONVERT TO DATETIME, FINALLY FLIP TO HAVE DATE IN ASCENDING ORDER
raw_weekly_data = pd.DataFrame(stock_weekly)
weekly_data = raw_weekly_data.T
weekly_data.reset_index(level=0, inplace=True)
weekly_data.rename(columns={
    'index': 'DATE', 
    '1. open': 'OPEN', 
    '2. high': 'HIGH',
    '3. low': 'LOW',
    '4. close': 'CLOSE',
    '5. volume': 'VOLUME'
    }, 
    inplace=True)
weekly_data['DATE'] = pd.to_datetime(weekly_data['DATE'])
weekly_data = weekly_data[::-1]
weekly_data = weekly_data.reset_index(drop=True)


# PLOT
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=weekly_data['DATE'], 
    y=weekly_data['CLOSE']))

fig.show()
2个回答

16

我收到了有关plotly的问题的答案,并决定分享。我使用了以下两种技术的组合:

错误是由于您数据框中列的数据类型不同。 dtypes值的类型为object。

然而,在以前的plotly版本中,这并不是问题(必须在您的Google Collab上安装)。新版本要求值为数字。

您可以像这样将列转换为数字:

#converting to type numeric
cols = weekly_data.columns.drop('DATE')
weekly_data[cols] = weekly_data[cols].apply(pd.to_numeric)

或者只需添加 autotypenumbers='convert types' 以更新您的图表:

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=weekly_data['DATE'], 
    y=weekly_data['CLOSE']))

fig.update_layout(autotypenumbers='convert types')

fig.show()

2
错误在于您的y轴数值数据类型。我猜测它们目前是字符串。尝试将这些值转换为float,应该可以解决问题。要将y轴中的所有值(即数据框中的“CLOSE”列)转换为float,可以执行以下操作: weekly_data['CLOSE'] = weekly_data['CLOSE'].astype(float)

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