【问题标题】:Python: How do I scale the points in this plot properly on the x-axis?Python:如何在 x 轴上正确缩放此图中的点?
【发布时间】:2020-02-26 11:38:58
【问题描述】:

这是我的数据集:

Date           Price    Peak     Trough
01-Jan-2002    33.78    False    False
02-Jan-2002    34.19    False    False
03-Jan-2002    35.44    False    False
04-Jan-2002    36.75    True     False
05-Jan-2002    32.28    False    True

我想将 价格 绘制为以日期为 X 轴的折线图。每当峰值 True 时,线上应该有一个绿点,而每当 Trough 是 True 时,线上应该有一个红点。

应该是这样的:

最好的解决方案是,如果我可以对其进行编码,那么只要条件为真,它就可以说明问题。但我不知道我是如何尝试制作两个新的数据框的。在 df1 中是峰值为真的所有数据点,在 df2 中是所有低谷为真的点。然后我尝试在一个图中绘制 3 个数据框,如下所示:

df.plot(x = 'Date', y = 'Price', figsize=(16,10))
plt.scatter(x = dfP['Date'], y = dfP['Price'], c = 'green')
plt.scatter(x = dfT['Date'], y = dfT['Price'], c = 'red')
plt.yscale('log')

但是,它不能正确缩放点:

如何正确缩放日期的点数?或者有没有一种更简单的方法,只要条件为真,我就可以设置点?提前致谢。

编辑:解决方案是不要将 pandas 与 matplotlib 混合。代码现在看起来像这样:

plt.figure(figsize=(16,10))
plt.plot(df['Date'], df['Dow Chemical Company (The)'])
plt.scatter(x = dfP['Date'], y = dfP['Dow Chemical Company (The)'], c = 'green')
plt.scatter(x = dfT['Date'], y = dfT['Dow Chemical Company (The)'], c = 'red')
plt.yscale('log')

现在所有点都正确显示在线上,但它在 x 轴上显示了我需要修复的每个日期。

【问题讨论】:

  • 绘制日期时间时不要混合使用 pandas 和 matplotlib。要么始终使用df.plot,要么使用plt.plot/scatter,但不能同时使用两者,因为它们对日期时间有不同的单位转换。
  • 非常感谢。我将其更改为 matplotlib,现在这些点已正确显示在线上。唯一已知的问题是它会在 x 轴上显示每个日期:i.imgur.com/xgVe3Ce.png 你知道如何解决这个问题吗?
  • 如果您使用字符串而不是日期时间对象,就会发生这种情况。
  • 非常感谢。我知道这些问题可能很简单,但作为初学者,我非常欣赏它。

标签: python-3.x matplotlib plot


【解决方案1】:

我的第一个想法是使用 matplotlib 的markevery,它在一条线上添加圆圈,但它们必须与线的颜色相同。我认为您使用单独的scatter 绘图的方法是正确的。我刚刚用Price 替换了True,用NaN 替换了False。 (如有必要,请制作副本!)与您想要的输出足够接近:

df.loc[df.Peak, 'Peak'] = df.loc[df.Peak, 'Price']
df.loc[df.Trough, 'Trough'] = df.loc[df.Trough, 'Price']
df = df.replace(False, np.NaN)

f, ax = plt.subplots(figsize=(10, 10))
plt.grid()
plt.plot(df.set_index('Date')['Price'], color='b', label='sunspot_SWO')
plt.scatter(df.Date, troughs, label='min', color='r')
plt.scatter(df.Date, peaks, label='max', color='g')
plt.legend(loc='lower right');

【讨论】:

  • 感谢您的意见。我通过使用 matplotlib 而不是 pandas 让它工作。我也试过你的版本,但在第一行收到一条错误消息:“None of [Index(['False', 'False', 'False', 'True', 'False', 'False', 'False', '假',\n '假', '假',\n ...\n '假', '假', '假', '假', '假', '假', '假', ' False',\n 'False', 'False'],\n dtype='object', length=2609)] 在 [index]" 中。如果我将前两行注释掉,我会收到一个错误,因为未定义“低谷”和“高峰”。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多