【问题标题】:Can't add 2nd plot to Log Transform figure无法将第二个图添加到对数变换图
【发布时间】:2018-09-05 16:26:30
【问题描述】:

根据下面的代码,绘制历史价格数据的对数转换可以正常工作,但是当将任何第二个图(例如收盘价)添加到图中时,对数转换被绘制为 ts=0 ?!

代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plot

df = pd.read_csv('historical_price_data.csv')
df = df[::-1]
df['Date'] = pd.to_datetime(df.Date, infer_datetime_format=True) 

# Set index to Date returns KeyError: "['Date'] not in index"
# df.set_index('Date', inplace=True)
df.sort_index(inplace=True)

# Log Transform 
log_transform = df['Close']
df['log'] = np.log(log_transform)

# Log transform plots fine by itself
ax = df[['Date', 'log']].plot(figsize=(14, 7), x='Date')

# Adding another plot to the figure results in log_transform being set to 0 !
ax = df[['Date', 'Close']].plot(figsize=(14, 7), x='Date', ax=ax)

plot.show()

请注意,使用单个 loc 而不是 2 绘制它们会导致日志转换线被压缩为 0 的相同问题:

ax = df[['Date', 'log', 'Close']].plot(x='Date')

【问题讨论】:

  • 您可能想在第二个 y 轴上绘图 - ax2=ax.twinx()
  • @DavidG 如何将 df['log'] 添加到 ax2 以便将它们都绘制在一个图中?

标签: python python-3.x pandas numpy matplotlib


【解决方案1】:

您的对数转换数据比原始数据小几个数量级(根据定义几乎),因此它在图表上的视觉折叠:Close 峰值约为 20000,而 log 峰值约为 @987654326 @。

将原始数据与同一图上的对数变换进行比较几乎没有意义。

如果您曾经修复过索引问题,请使用以下内容在单独的图上绘制:

df['log'] = np.log(df['Close'])
df[['Close', 'log']].plot(figsize=(14, 7), subplots=True)

【讨论】:

  • 我对索引问题感到困惑。熊猫已经将索引设置为日期吗?我想有人提到如果是这种情况,你尝试再次添加它,你可能会看到这样的行为。
  • @Compusstretch 在read_csv 之后尝试df.columns = ['Date', 'Close']。我无法在我这边重现您的问题,一切正常。尝试重新启动您的环境并重新运行代码。
  • 它如何为您工作!我已经在 2 台不同的机器上尝试过,之前的 OSX,以及带有 pandas 0.23.3 和 matplotlib: 2.2.2 的 Linux 机器。 - 所以不会让我发布后续内容,但我会对你的工作方式感兴趣吗?我运行的代码很简单:pastebin.com/krXJ9YWW
  • @Compustretch df.index 返回索引。
  • 我仍然对这对你有用。你能使用相同的确切代码吗? stackoverflow.com/questions/52195269/…
【解决方案2】:

如果您想将数据绘制在同一个子图上,而不是在 2 个单独的子图上,您可以使用 ax.twinx() 创建一个辅助 y 轴。您可以使用 ax= 将这个新轴作为参数传递给绘图函数:

ax = df[['Date', 'log']].plot(figsize=(14, 7), x='Date')

ax2 = ax.twinx() # create seconday y axis and pass it into the plotting function below
ax2 = df[['Date', 'Close']].plot(figsize=(14, 7), x='Date', ax=ax2)

【讨论】:

  • 谢谢@DavidG,很抱歉我这么仓促接受安德烈的回答。
  • @Compustretch 没问题,你可以接受任何你想要的答案:-)
【解决方案3】:

另一种语法:

df['rolling_mean'] = df.Close.rolling(window=7).mean()
df.plot(x='Date', y=['Close', 'rolling_mean'], logy=True, figsize=(15,5))

使用模拟数据集:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多