import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
plt.style.use('ggplot')
foo = np.random.randn(300)
#plt.annotate(label, # this is the text
# (x,y), # this is the point to label
# textcoords="offset points", # how to position the text
# xytext=(0,10), # distance from text to points (x,y)
# ha='center') # horizontal alignment can be left, right or center
figsize = (14,6)
data = foo
m_size = 12
fig, ax = plt.subplots(1, 1, figsize=figsize)
ax.plot(data, 'b', alpha=0.4)
for k,v in ax.spines.items():
v.set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
#mark the max
if np.argmax(data) != 0 and np.argmax(data) != len(data):
plt.plot(np.argmax(data), np.max(data), '.', color='blue', markersize=m_size)
plt.annotate("{:.2f}".format(data[np.argmax(data)]),
(np.argmax(data),
np.max(data)),
textcoords="offset points",
xytext=(0,10), ha='center')
#mark the min
if np.argmin(data) != 0 and np.argmin(data) != len(data):
plt.plot(np.argmin(data), np.min(data), '.', color='blue', markersize=m_size)
plt.annotate("{:.2f}".format(data[np.argmin(data)]),
(np.argmin(data), np.min(data)),
textcoords="offset points",
xytext=(0,-10), ha='center')
#mark the end
plt.plot(len(data) - 1, data[len(data) - 1], 'r.', markersize=m_size)
#mark the start
plt.plot(0, data[0], 'r.', markersize=m_size)
#ax.fill_between(range(len(data)), data, len(data)*[min(data)], alpha=0.1)
[<matplotlib.lines.Line2D at 0x7ff53da45350>]
Make this a function so it's easier to handle.
def create_spark_line(data):
figsize = (22,8)
m_size = 12
f_size = 14
fig, ax = plt.subplots(1, 1, figsize=figsize)
ax.plot(data, 'b', alpha=0.4)
for k,v in ax.spines.items():
v.set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
#mark the max
if np.argmax(data) != 0 and np.argmax(data) != len(data):
plt.plot(np.argmax(data), np.max(data), '.', color='blue', markersize=m_size)
plt.annotate("{:.2f}".format(data[np.argmax(data)]),
(np.argmax(data),
np.max(data)),
textcoords="offset points",
xytext=(0,10), ha='center', fontsize=f_size)
#mark the min
if np.argmin(data) != 0 and np.argmin(data) != len(data):
plt.plot(np.argmin(data), np.min(data), '.', color='blue', markersize=m_size)
plt.annotate("{:.2f}".format(data[np.argmin(data)]),
(np.argmin(data), np.min(data)),
textcoords="offset points",
xytext=(0,-15), ha='center', fontsize=f_size)
#mark the end
plt.plot(len(data) - 1, data[len(data) - 1], 'r.', markersize=m_size)
plt.annotate("{:.2f}".format(data[len(data) - 1]),
(len(data) - 1, data[len(data) - 1]),
textcoords="offset points",
xytext=(45,-5), ha='right', fontsize=f_size, color='red')
#mark the start
plt.plot(0, data[0], 'r.', markersize=m_size)
plt.annotate("{:.2f}".format(data[0]),
(0, data[0]),
textcoords="offset points",
xytext=(-45,-5), ha='left', fontsize=f_size, color='red')
#ax.fill_between(range(len(data)), data, len(data)*[min(data)], alpha=0.1)
return ax
create_spark_line(np.random.randn(200))
<AxesSubplot:>
def create_spark_lines(dataz):
figsize = (22,8)
m_size = 12
f_size = 14
fig, ax = plt.subplots(1, 1, figsize=figsize)
space_factor = 10
for idx, ddata in enumerate(dataz):
data = ddata + idx*space_factor
ax.plot(data, 'b', alpha=0.4)
for k,v in ax.spines.items():
v.set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
#mark the max
if np.argmax(data) != 0 and np.argmax(data) != len(data):
plt.plot(np.argmax(data), np.max(data), '.', color='blue', markersize=m_size)
plt.annotate("{:.2f}".format(ddata[np.argmax(data)]),
(np.argmax(data),
np.max(data)),
textcoords="offset points",
xytext=(0,10), ha='center', fontsize=f_size)
#mark the min
if np.argmin(data) != 0 and np.argmin(data) != len(data):
plt.plot(np.argmin(data), np.min(data), '.', color='blue', markersize=m_size)
plt.annotate("{:.2f}".format(ddata[np.argmin(data)]),
(np.argmin(data), np.min(data)),
textcoords="offset points",
xytext=(0,-15), ha='center', fontsize=f_size)
#mark the end
plt.plot(len(data) - 1, data[len(data) - 1], 'r.', markersize=m_size)
plt.annotate("{:.2f}".format(ddata[len(data) - 1]),
(len(data) - 1, data[len(data) - 1]),
textcoords="offset points",
xytext=(45,-5), ha='right', fontsize=f_size, color='red')
#mark the start
plt.plot(0, data[0], 'r.', markersize=m_size)
plt.annotate("{:.2f}".format(ddata[0]),
(0, data[0]),
textcoords="offset points",
xytext=(-45,-5), ha='left', fontsize=f_size, color='red')
#ax.fill_between(range(len(data)), data, len(data)*[min(data)], alpha=0.1)
return fig, ax
create_spark_lines([np.random.randn(300), np.random.randn(300), np.random.randn(300)])
(<Figure size 1584x576 with 1 Axes>, <AxesSubplot:>)
def create_spark_lines(dataz, labelz, space_factor=3, text_offset=250, font_size=14, marker_cutoff=10):
figsize = (10,8)
m_size = 12
f_size = font_size
l_size = f_size + 20
fig, ax = plt.subplots(1, 1, figsize=figsize)
#space_factor = 10
def rescale_data(data):
# scale to between -1 <-> 1
data = np.array(data)
_min = np.min(data)
_max = np.max(data)
sdata = data - np.mean(data)
sfactor = (_max - _min) / 2
sdata /= sfactor
return sdata
for idx, ddata in enumerate(zip(dataz, labelz)):
#scale data
# offset data series
sdata = rescale_data(ddata[0])
data = sdata + idx*space_factor
ax.plot(data, 'black', alpha=0.4)
for k,v in ax.spines.items():
v.set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
#mark the max
if np.argmax(data) not in range(marker_cutoff) and np.argmax(data) not in range(len(data)-marker_cutoff, len(data)):
plt.plot(np.argmax(data), np.max(data), '.', color='black', alpha=0.6, markersize=m_size)
plt.annotate("{:.2f}".format(ddata[0][np.argmax(data)]),
(np.argmax(data),
np.max(data)),
textcoords="offset points",
xytext=(0,10), ha='center', fontsize=f_size)
#mark the min
if np.argmin(data) not in range(marker_cutoff) and np.argmin(data) not in range(len(data)-marker_cutoff, len(data)):
plt.plot(np.argmin(data), np.min(data), '.', color='black', alpha=0.6, markersize=m_size)
plt.annotate("{:.2f}".format(ddata[0][np.argmin(data)]),
(np.argmin(data), np.min(data)),
textcoords="offset points",
xytext=(0,-20), ha='center', fontsize=f_size)
#mark the end
plt.plot(len(data) - 1, data[len(data) - 1], 'r.', markersize=m_size)
plt.annotate("{:.1f}".format(ddata[0][len(data) - 1]),
(len(data) - 1, data[len(data) - 1]),
textcoords="offset points",
xytext=(15,-5), ha='left', fontsize=f_size, color='red')
#mark the start
plt.plot(0, data[0], 'r.', markersize=m_size)
plt.annotate("{:.1f}".format(ddata[0][0]),
(0, data[0]),
textcoords="offset points",
xytext=(-15,-5), ha='right', fontsize=f_size, color='red')
#add label
plt.annotate("{}".format(ddata[1]),
(text_offset, np.mean(data[0])),
textcoords="offset points",
xytext=(75,0), ha='left', fontsize=l_size, color='black', alpha=0.4)
return fig, ax
f, _ = create_spark_lines([np.random.randn(300), np.random.randn(300), np.random.randn(300)], ['Leman','Goldman','JP'])
f.patch.set_facecolor('xkcd:mint green')
#f.savefig('test_spark.pdf')
f, _ = create_spark_lines([np.random.randn(300), np.random.randn(300), np.random.randn(300)], ['Leman','Goldman','JP'])
f.patch.set_facecolor('white')
plt.rcParams['axes.facecolor']='w'
#f.savefig('test_spark.pdf')
assets = ['AAPL', 'MSFT', 'TSLA', 'RTX', 'GOOG', 'FB']
data = []
for i, asset in enumerate(assets):
data.append(yf.download(asset, start='2019-01-01', end='2019-12-31', progress=False)['Close'])
f, _ = create_spark_lines([ data[i] for i in range(len(data))], [a for a in assets],
space_factor = 6,
text_offset=250,
font_size=15,
marker_cutoff=10)
f.patch.set_facecolor('white')
plt.rcParams['axes.facecolor']='w'
plt.tight_layout()
#f.savefig('test_spark.pdf')