绘制从整个数据生成的图像的某些部分

时间:2019-12-23 03:09:20

标签: python image plot

下面的简单代码可从股票数据绘制烛台图,显示60天移动平均线。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc
from mpl_finance import candlestick_ohlc

data = pd.read_csv('C:\\AAPL.csv')

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = fig.add_subplot(111)

data['MA60'] = data['Close'].rolling(window=60).mean()

cl =candlestick2_ohlc(ax=ax1,opens=data['Open'],
highs=data['High'],lows=data['Low'],
closes=data['Close'],width=0.4, colorup='#77d879', 
colordown='#db3f3f')

ax1.set_xticks(np.arange(len(data)))
ax1.set_xticklabels(data['Date'], fontsize=6, rotation=-90)
ax2.plot(data.Date, data['MA60'], label='MA_60')

plt.show()   # plt.show() shall be after "plt.savefig" otherwise outputs an empty image file.

上面的代码看起来很笨拙,但是可以正常工作。

数据有90行,因此可以毫无问题地显示60天移动平均线。

但是我只想要图表的一部分,即最近45天。

如果代码仅读取和使用最近45天的数据,则无法生成60MA的图表。

所以我想用整个90天的时间进行制作(在那里有60MA),并且只显示并保存图像的右半部分。

plt.savefig('C:\\AAPL.png')
img = plt.imread('C:\\AAPL.png')
print(img.shape)   # (480, 640, 4)
img_cropped = img[:, 320:, :] # right half of the image
img_cropped.savefig('C:\\AAPL-1.png')

无法解决问题。

什么是适当的和体面的方式,可以从整个数据中产生图像的某些部分?谢谢。

1 个答案:

答案 0 :(得分:1)

您是如此接近,您只在最后一行出错了!当您使用plt.imread()重新加载绘图时,它变成了图像而不是图形,因此您必须使用plt.imsave()将其保存在最后一行:

plt.imsave('result.png',img_cropped)