Question

The following code snippet is plotting two candlestick series of 4 bars:

from pylab import * 
from matplotlib.finance import candlestick
import matplotlib.gridspec as gridspec

quotes = [(734542.0, 1.326, 1.3287, 1.3322, 1.3215), (734543.0, 1.3286, 1.3198, 1.3292, 1.3155), (734546.0, 1.321, 1.3187, 1.3284, 1.3186), (734547.0, 1.3186, 1.3133, 1.3217, 1.308)]
quotes2 = [(734542.0, 1.0, 0.9979, 1.0046, 0.9953), (734543.0, 0.998, 0.9991, 1.0024, 0.9952), (734546.0, 0.9991, 1.0014, 1.0038, 0.9951), (734547.0, 1.003, 1.0028, 1.0047, 1.0002)]

fig, ax = subplots()
candlestick(ax,quotes,width = 0.5, colorup = "green", colordown = "red")
candlestick(ax,quotes2, width = 0.2, colorup = "grey", colordown = "black")
ax.xaxis_date()
ax.autoscale_view()
ax.legend(loc=3)


plt.show()

I'm not being able to add a label to the two series and on the web I didn't find anything yet. What's the right syntaxis to do this?

candlestick(ax,quotes,width = 0.5, label = "Series 1") #but it doesn't work

NOTE: what I need is not annotating something on a specific point such as this or other threads explain, but a proper label to be added to the chart legend since the final purpose is to plot several normalized price series to be visually compared each other.

ADD: more precisely, the "but it doesn't work" rough attempt doesn't work indeed for the following expected error:

TypeError: candlestick() got an unexpected keyword argument 'label'
Was it helpful?

Solution

You need changes to a few place to get the labels:

C1=candlestick(ax,quotes,width = 0.5, colorup = "green", colordown = "red")
C2=candlestick(ax,quotes2, width = 0.2, colorup = "grey", colordown = "black")
ax.xaxis_date()
ax.autoscale_view()
ax.legend((C1[1][0],C2[1][0]), ('label1', 'label2'),loc=3)

enter image description here

The problem is that we have colorup and colordown here, you can't easily put them both in the legend (well, you may be able to, that will be quite complex).

So why C2[1][0]? Because this is what C1 is:

In [5]:

C1
Out[5]:
([<matplotlib.lines.Line2D at 0x76b3c90>,
  <matplotlib.lines.Line2D at 0x759d3b0>,
  <matplotlib.lines.Line2D at 0x759dab0>,
  <matplotlib.lines.Line2D at 0x75a61d0>],
 [<matplotlib.patches.Rectangle at 0x76b3df0>,
  <matplotlib.patches.Rectangle at 0x759d590>,
  <matplotlib.patches.Rectangle at 0x759dc90>,
  <matplotlib.patches.Rectangle at 0x75a63b0>])

If you have other plot that will follow the candlestick plots:

plt.hlines(1.10, plt.xlim()[0], plt.xlim()[1], label='Other Plot') #such as an horizontal line
#And may be other plots.
handles, labels = ax.get_legend_handles_labels()
import operator
hl = sorted(zip(handles, labels),
            key=operator.itemgetter(1)) #sort is optional
handles2, labels2 = zip(*hl)
handles2=list(handles2)+[C1[1][0],C2[1][0]] #put the candel plot legend to the end
labels2=list(labels2)+['label1', 'label2'] #put the candel plot legend to the end
ax.legend(handles2, labels2, loc=8)

enter image description here

Taking from the documents.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top