Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to add legend to the plot? #181

Open
jainraje opened this issue Jun 18, 2020 · 28 comments
Open

how to add legend to the plot? #181

jainraje opened this issue Jun 18, 2020 · 28 comments
Labels
question Further information is requested

Comments

@jainraje
Copy link

How to add a legend to the plots? For example, if using several moving averages it will be useful to show a legend to map moving averages to line plots.

Is clear how this is done using matplotlib but I did not see an example of how to do so using the mplfinance package.

TIA,

@jainraje jainraje added the question Further information is requested label Jun 18, 2020
@DanielGoldfarb
Copy link
Collaborator

Rajeev,
Legends are not yet available in mplfinance. Hopefully soon (maybe a couple months or so).

In the meantime, if you want to play with matplotlib, you can try using the returnfig=True kwarg in mplfinance and attempt to display legends by having access to the Figure and Axes that mplfinance creates.

Alternatively if you would like to contribute code to mplfinance to make it easy for users to include legends, I would be happy to work together with you on getting that code correctly merged into mplfinance.

All the best. Thanks for you interest in mplfinance. --Daniel

@jainraje
Copy link
Author

Hi Daniel,
I appreciate your comments. I'll give it a try. This package seems to be going in a good direction. Can we have a side bar on how I can contribute code to the package? You can email me directly at [email protected].

All the best
--Rajeev

@arthurpdesimone
Copy link

Plot chart to figure and axis object

    fig, axes = mpf.plot(df, type='candle', mav=mav_tuple, returnfig=True)
    # Configure chart legend and title
    axes[0].legend(mav_titles)
    axes[0].set_title(ticker)
    # Save figure to file
    fig.savefig(path_to_figure)

This does the trick thanks to the help of mr. Daniel Goldfarb.

@DanielGoldfarb
Copy link
Collaborator

@arthurpdesimone
Thank you for posting a specific example to help others. Much appreciated. All the best. --Daniel

@YoungilKoh
Copy link

@arthurpdesimone Thank you for posting a specific example to help others. Much appreciated. All the best. --Daniel

Hi, I'm Youngil Koh

I think the sample code below would be helpful.

style = mpf.make_mpf_style(marketcolors=mpf.make_marketcolors(up="r", down="#0000CC",inherit=True),
                           gridcolor="gray", gridstyle="--", gridaxis="both")                    

added_plots = {"EMA112" : mpf.make_addplot(data['EMA112'].iloc[start:]),
               "EMA224" : mpf.make_addplot(data['EMA224'].iloc[start:]),
               "BBLow" : mpf.make_addplot(data['BBLow'].iloc[start:]),
               "Close" : mpf.make_addplot(data['Close'].iloc[start:])
}

fig, axes = mpf.plot(data.iloc[start:, 0:5], type="candle", style=style,
                     addplot=list(added_plots.values()),
                     volume=True,
                     returnfig=True)
                     
axes[0].legend([None]*(len(added_plots)+2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:],labels=list(added_plots.keys()))

axes[0].set_ylabel("Price [KRW]")
axes[0].yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))
axes[2].set_ylabel("Volume [ea]")
axes[2].yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))

output

@DanielGoldfarb
Copy link
Collaborator

@YoungilKoh
Thank you so much! That is an excellent example! Much appreciated.

@BlackSharkJ
Copy link

@arthurpdesimone Thank you for posting a specific example to help others. Much appreciated. All the best. --Daniel

Hi, I'm Youngil Koh

I think the sample code below would be helpful.

style = mpf.make_mpf_style(marketcolors=mpf.make_marketcolors(up="r", down="#0000CC",inherit=True),
                           gridcolor="gray", gridstyle="--", gridaxis="both")                    

added_plots = {"EMA112" : mpf.make_addplot(data['EMA112'].iloc[start:]),
               "EMA224" : mpf.make_addplot(data['EMA224'].iloc[start:]),
               "BBLow" : mpf.make_addplot(data['BBLow'].iloc[start:]),
               "Close" : mpf.make_addplot(data['Close'].iloc[start:])
}

fig, axes = mpf.plot(data.iloc[start:, 0:5], type="candle", style=style,
                     addplot=list(added_plots.values()),
                     volume=True,
                     returnfig=True)
                     
axes[0].legend([None]*(len(added_plots)+2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:],labels=list(added_plots.keys()))

axes[0].set_ylabel("Price [KRW]")
axes[0].yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))
axes[2].set_ylabel("Volume [ea]")
axes[2].yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))

output

Thank you for your help. You're amazing

@quebeh
Copy link

quebeh commented May 2, 2022

I found an issue while following @YoungilKoh 's answer (#181 (comment))

It worked, but only one of the plots can display (see attachment).

I'll need help on why only one of them is showing in the legends.

I debugged it, and i think i know the issue, the legendHandles only gives one Line2D object when printed, this might be a hint that can help us find the problem

unknown

@YoungilKoh
Copy link

I found an issue while following @YoungilKoh 's answer (#181 (comment))

It worked, but only one of the plots can display (see attachment).

I'll need help on why only one of them is showing in the legends.

I debugged it, and i think i know the issue, the legendHandles only gives one Line2D object when printed, this might be a hint that can help us find the problem

unknown

Thanks for your comments!
Can you share your code related to the figures you showed me?
It would be helpful for me.

@quebeh
Copy link

quebeh commented May 2, 2022

Can you share your code related to the figures you showed me?

Here's my code:

ap = [
        make_addplot(pd.DataFrame(MACD), color='r', panel=1),
        make_addplot(pd.DataFrame(Signal), color='b', panel=1)
    ]
    
    axes: List[Axes]
    fig, axes = plot(
        df, title='Graph', 
        type='candlestick', 
        style='yahoo', addplot=ap, 
        returnfig=True
    )

    axes[2].legend([None]*(len(ap)+2))
    handles = axes[2].get_legend().legendHandles
    axes[2].legend(handles=handles, labels=['MACD', 'Signal'])

Did some edits in the second call of axes[2].legend, in your example, it was supposed to be handles=handles[2:], but if i do that, it just completely removes the legends. I removed the [2:] and it worked, but still, only one is showing.

Thank you for helping.

@quebeh
Copy link

quebeh commented May 6, 2022

Well out of nowhere, it just got fixed, i think its a new update, i used the same method. Thanks!

@cryptoliciousdev
Copy link

hi, also need labels help w mplfinance. but you guys lost me per how i could adapt my code to do labels , in a script run in powershell, and save to a file.
previously working code that writes my plots to file but no labels...

ap2 = [
        mpf.make_addplot(df['SUPERTl'].tail(200), color='g'),
        mpf.make_addplot(df['SUPERTs'].tail(200), color='r'),
        mpf.make_addplot(df['PSARl'].tail(200), color='y'),
        mpf.make_addplot(df['PSARs'].tail(200), color='y'),
        mpf.make_addplot(df['stochrsi_K_ultragtx'].tail(200), color='g', panel=2),  # panel 2 specified
        mpf.make_addplot(df['stochrsi_D_ultragtx'].tail(200), color='b', panel=2),  # panel 2 specified
        mpf.make_addplot(df['MACD_6_12_9'].tail(200),  color='y', secondary_y=True, panel=3),
        mpf.make_addplot(df['MACDh_6_12_9'].tail(200), color='r', secondary_y=True, panel=3),
        mpf.make_addplot(df['MACDs_6_12_9'].tail(200), color='b', secondary_y=True, panel=3)
    ]
    mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), addplot=ap2,  style='charles', savefig=save)

i changed it to this, but get
error
cannot unpack non-iterable NoneType object
TypeError('cannot unpack non-iterable NoneType object')

i dont understand how you could do the fig,axes part AFTER you call mpf.plot. like that would have to be before .plot() call which has the savefig= param. i do have 3 panels. candles, stock and macd. but im lost per how to get labels on the plot and save it to a file from a script.
thanks. code i tried per above replies:


ap2 = {
        "SuperTrend_Long": mpf.make_addplot(df['SUPERTl'].tail(200), color='g'),
        "SuperTrend_Short": mpf.make_addplot(df['SUPERTs'].tail(200), color='r'),
        "PSAR_Long": mpf.make_addplot(df['PSARl'].tail(200), color='y'),
        "PSAR_Short": mpf.make_addplot(df['PSARs'].tail(200), color='y'),
        "stochrsi_K": mpf.make_addplot(df['stochrsi_K_ultragtx'].tail(200), color='g', panel=2),  # panel 2 specified
        "stochrsi_D": mpf.make_addplot(df['stochrsi_D_ultragtx'].tail(200), color='b', panel=2),  # panel 2 specified
        "MACD": mpf.make_addplot(df['MACD_6_12_9'].tail(200),  color='y', secondary_y=True, panel=3),
        "MACDh": mpf.make_addplot(df['MACDh_6_12_9'].tail(200), color='r', secondary_y=True, panel=3),
        "MACDs": mpf.make_addplot(df['MACDs_6_12_9'].tail(200), color='b', secondary_y=True, panel=3)
    }
   
    fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), addplot=list(ap2.values()),  style='charles', savefig=save)
    axes[0].legend([None]*(len(ap2)+2))
    handles = axes[0].get_legend().legendHandles
    axes[0].legend(handles=handles[2:], labels=list(ap2.keys()))
    # IPydisplay.Image(ourpath)
    print('createimg save file')
    fig.savefig('plots/btcplot.png')

@DanielGoldfarb
Copy link
Collaborator

The problem, I think, is in this line of code:

fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), 
                     addplot=list(ap2.values()),  style='charles', savefig=save)

change savefig to returnfig=True :

fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), 
                     addplot=list(ap2.values()),  style='charles', returnfig=True)

@cryptoliciousdev
Copy link

this helped BUT how do i get proper colors on other panels ....lost a whole day experimenting , no luck. thanks in advance

The problem, I think, is in this line of code:

fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), 
                     addplot=list(ap2.values()),  style='charles', savefig=save)

change savefig to returnfig=True :

fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), 
                     addplot=list(ap2.values()),  style='charles', returnfig=True)

ap3 = {

    "SuperTrend_Long": mpf.make_addplot(df['SUPERTl'].tail(tail_num), color='g'),
    "SuperTrend_Short": mpf.make_addplot(df['SUPERTs'].tail(tail_num), color='r'),
    "PSAR_Long": mpf.make_addplot(df['PSARl'].tail(tail_num), color='y'),
    "PSAR_Short": mpf.make_addplot(df['PSARs'].tail(tail_num), color='y'),
    "EMA_15": mpf.make_addplot(df['EMA_15'].tail(tail_num),  color='#000055'),
    "EMA_20": mpf.make_addplot(df['EMA_20'].tail(tail_num),  color='#000099'),
    "EMA_30": mpf.make_addplot(df['EMA_30'].tail(tail_num),  color='#0000CC'),
    "EMA_50": mpf.make_addplot(df['EMA_50'].tail(tail_num),  color='#005500'),
    "EMA_75": mpf.make_addplot(df['EMA_75'].tail(tail_num),  color='#00CC00'),
    "EMA_100": mpf.make_addplot(df['EMA_100'].tail(tail_num),  color='#990000'),
    "EMA_200": mpf.make_addplot(df['EMA_200'].tail(tail_num),  color='#CC0000'),
    "stochrsi_K": mpf.make_addplot(df['stochrsi_K_ultragtx'].tail(tail_num), color='g', panel=2),  # panel 2 specified
    "stochrsi_D": mpf.make_addplot(df['stochrsi_D_ultragtx'].tail(tail_num), color='b', panel=2),  # panel 2 specified
    "MACDh": mpf.make_addplot(df['MACDh_6_12_9'].tail(tail_num), color='r', secondary_y=True, panel=3),
    "MACDs": mpf.make_addplot(df['MACDs_6_12_9'].tail(tail_num), color='b', secondary_y=True, panel=3)
}
print('making axes0 legend')
fig, axes = mpf.plot(df.tail(tail_num), type='candle', volume=True,  addplot=list(ap3.values()),  style='charles',
                     returnfig=True, title=('Last '+str(tail_num)+' candles'+fname), scale_width_adjustment=dict(lines=0.25))
axes[0].legend([None]*(len(ap3)+2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:], labels=list(ap3.keys()), loc='upper left', fontsize='x-small')
#axes[0].legend(loc='upper left', fontsize='x-small')
# IPydisplay.Image(ourpath)
print(axes)
axes[4].set_ylabel("MACD")
axes[6].set_ylabel("StochRSI")
print(axes)
print(len(ap3))
try:
    axes[4].legend([None]*(len(ap3)+2))

    axes[4].legend(handles=handles[2:], labels=['MACDh', 'MACDs'], loc='center left', fontsize='x-small')
except Exception as e:
    print('error making legend axis4')
    print(e)
print('making axes6 legend')
try:
    # axes[6].legend([None]*(len(ap3)+2))
    # axes[6].legend([None]*(2+2))
    #handles6 = axes[6].get_legend().legendHandles
    axes[6].legend(handles=handles[2:], labels=['stochrsi_K', 'stochrsi_D'], loc='center left', fontsize='x-small')
except Exception as e:
    print('error making legend axis6')
    print(e)
fig.savefig('plots/'+fname, dpi=300)

2022-06-23_23_00_00_UTC_BTC-USDT_1h

you see ax6 , the stochrsi subplot on the bottom....i dont understand how to reference that handles of legend should be the correct colors. its obviuosly giving the colors of the top panels first 2...but no matter what i tried n read in the docs, i couldnt find examples both ref'd panels legend and from a addplot list.
thanks

@DanielGoldfarb
Copy link
Collaborator

DanielGoldfarb commented Jun 24, 2022

Have you tried using axes[7]? You have a total of 4 panels (0-3), which means 8 Axes: 0-7

Also, I'm confused by something in your code: The code appears to be putting StochRSI on panel 2, and macd on panel 3. But in the plot image StochRSI is on the bottom panel (panel 3) and MACD is just above that (panel 2).

I would also point out that the StochRSI panel has y-ticks on both the left and right, which suggests that between 'stochrsi_K' and 'stochrsi_D', one of them may be using axes[7] and the other axes[6]. If this is what you want, fine. If not, then you can code specifically secondary_y=False (or True, depending what you want), because by not specifying secondary_y at all, its default value is 'auto' which means that mplfinance may decide to put them on separate Axes.

@DanielGoldfarb
Copy link
Collaborator

Also, one other point to keep in mind, that may have an effect:
The "charles" style puts the primary axes on the right (see y_on_right = True inside the "charles" style definition file). This means that secondary_y will be on the left. Thus Axes 0,2,4,6 have their y-values on the right, while Axes 1,3,5,7 are have their y-values on the left.

Keep in mind that if you don't specify secondary_y (thus defaulting to 'auto') then the first data plotted on each panel will go on the primary axes (0,2,4,6) while any subsequent data may be plotted on the on either the primary (0,2,4,6) or the secondary (1,3,5,7) depending on what mplfinance decides. You can force it to be on primary or secondary by specifying secondary_y=False (primary) or secondary_y=True (secondary).

@cryptoliciousdev
Copy link

YES , thanks, my mistake flipping the labels and secondary_y all being true. fixed that!
and i got the stochrsi colors to be correct in the legend now :D pulling into handles4 and referencing handles4 made it work!

    try:
        axes[4].legend([None]*(len(ap3)+2))
        handles4 = axes[4].get_legend().legendHandles
        axes[4].legend(handles=handles4, labels=['stochrsi_K', 'stochrsi_D'], loc='center left', fontsize='x-small')
    except Exception as e:
        print('error making legend axis4')
        print(e)

Also, one other point to keep in mind, that may have an effect: The "charles" style puts the primary axes on the right (see y_on_right = True inside the "charles" style definition file). This means that secondary_y will be on the left. Thus Axes 0,2,4,6 have their y-values on the right, while Axes 1,3,5,7 are have their y-values on the left.

Keep in mind that if you don't specify secondary_y (thus defaulting to 'auto') then the first data plotted on each panel will go on the primary axes (0,2,4,6) while any subsequent data may be plotted on the on either the primary (0,2,4,6) or the secondary (1,3,5,7) depending on what mplfinance decides. You can force it to be on primary or secondary by specifying secondary_y=False (primary) or secondary_y=True (secondary).

THANKS and hope the mulitpanel legend struggle of mine helps people
2022-06-24_01_00_00_UTC_BTC-USDT_1h
.

@DanielGoldfarb
Copy link
Collaborator

THANKS and hope the mulitpanel legend struggle of mine helps people

There is no question. Posting your struggles here definitely helps other mplfinance users.

Not only does it help them directly, but it will help them indirectly in the future, as it is my intention to implement a legends kwarg to mplfinance.plot() hopefully before the end of this year. All of the posts in this issue will certainly help guide that implementation in order to make the legends kwarg of mplfinace both as simple to use, and as flexible, as possible.

Two addition things:

  1. Looking at your last plot it appears that "MACDh" in the legend somehow picked up green instead of blue.
    I can't see why because the code is not posted, which leads me to my second item:
  2. Would you mind posting your final complete code here for all to see? That will be most helpful and very appreciated by your fellow mplfinance users.

Finally, let me just say that your plot is one of the best mplfinance plots I have ever seen! Really, excellent job! Thank you for sharing!

All the best. --Daniel

@drdoof2019
Copy link

drdoof2019 commented Jul 29, 2022

def plotting_datav5(symbol, interval, frame, max_price, first_level, second_level, third_level, fourth_level, min_price):
    mc = mpf.make_marketcolors(up='g',down='r',alpha=0.5,volume={'up':'g','down':'r'})
    s  = mpf.make_mpf_style(base_mpf_style='binance',marketcolors=mc,gridstyle='')


    fig = mpf.figure(style=s,figsize=(12,9))
    ax = fig.add_subplot()
    ax.set_title(f'{symbol} {interval} Fibonnacci Seviyeleri') # ,loc='left'

    frame['max_price'] = [max_price] * len(frame)
    frame['first_level'] = [first_level] * len(frame)
    frame['second_level'] = [second_level] * len(frame)
    frame['third_level'] = [third_level] * len(frame)
    frame['fourth_level'] = [fourth_level] * len(frame)
    frame['min_price'] = [min_price] * len(frame)
    apds = {"EMA50": mpf.make_addplot(frame['EMA50'],ax=ax,color='blue'),
            "EMA144": mpf.make_addplot(frame['EMA144'],ax=ax,color='orange'),
            "max_price": mpf.make_addplot(frame['max_price'], ax=ax, linestyle='--', alpha=0.5, color='red'),
            "first_level": mpf.make_addplot(frame['first_level'], ax=ax, linestyle='--', alpha=0.5, color='orange'),
            "second_level": mpf.make_addplot(frame['second_level'], ax=ax, linestyle='--', alpha=0.5, color='aqua'),
            "third_level": mpf.make_addplot(frame['third_level'], ax=ax, linestyle='--', alpha=0.5, color='green'),
            "fourth_level": mpf.make_addplot(frame['fourth_level'], ax=ax, linestyle='--', alpha=0.5, color='blue'),
            "min_price": mpf.make_addplot(frame['min_price'], ax=ax, linestyle='--', alpha=0.5, color='purple'),
            }

    ax.legend([None] * (len(apds) + 2))
    handles = ax.get_legend().legendHandles
    ax.legend(handles=handles[2:], labels=list(apds.keys()), loc='upper left', fontsize='x-small')
    # axes[0].legend(loc='upper left', fontsize='x-small')
    mpf.plot(frame,ax=ax,type='candle',xrotation=0,addplot=list(apds.values()),tight_layout=False)

    plt.savefig('Figure_1.png',bbox_inches='tight')
    mpf.show()

This gives error:

No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

Couldn't find what is the cause of error. Can anybody help?
Ps: I can see drawing but no legends

@ashraf2000shweky
Copy link

with subplots it's easy👍👍

fig , ax =plt.subplots(3,1,sharex=True,figsize=(10,10),gridspec_kw= {'height_ratios':[3,2,2]})

fig.set_edgecolor('k')
fig.set_linewidth(4)
fig.set_facecolor('cyan')
ax3 = ax[2].twinx()

p2 = [ mpf.make_addplot(data['High'],color='g',ax=ax[2]),
mpf.make_addplot(data['Low'],color='b',ax=ax[2]),
mpf.make_addplot(data['macd'],ax=ax3,color='r')]

mpf.plot(data,type='candle',ax=ax[0], addplot=p2 ,style='blueskies',volume=ax[1],mav=(6,9))
fig.suptitle('AAPL')

ax[0].legend(labels=['nolegend','nolegend','mav6','mav9'])
ax[2].legend(['High','Low'])
ax3.legend(['MACD'],bbox_to_anchor=[0.7,0.2])
ax[2].grid(False)
ax[0].set_ylabel('Price',fontsize=15,labelpad=30,color='r')
ax[1].set_ylabel('Volume',fontsize=10,labelpad=35,color='r')

plt.tight_layout()
plt.show()

@DavidT-123
Copy link

DavidT-123 commented May 21, 2023

Support for legends is a very important capability for mplfinance to directly support. In the meantime, I really liked the sample code from Youngil Koh and it allowed me to succeed in my efforts to get proper legend display.

My application is a bit complex and the addplots are conditionally created. To avoid rewriting it to conform to the example code, I decided to get the labels out of the addplot data structures. Here is the resulting code snippet and function which I created for my application. It creates the legend for the main panel (panel 0) or any of the sub panels.

def plotter(someargs):
    ....
    style = mpf.make_mpf_style(gridcolor="gray", gridstyle="--", gridaxis="both", facecolor='0.98', figcolor='0.93',
                        marketcolors=mpf.make_marketcolors(volume={'up':'tab:green', 'down':'tab:red'}, vcdopcod=True))

    fig, axes = mpf.plot(df, type=ptype, volume=volume_requested, figscale=2, title=title, tight_layout=True,
                       panel_ratios=panel_ratios, addplot=ap_list, scale_width_adjustment=dict(lines=0.9, volume=0.9),
                       linecolor='black', style=style, returnfig=True)

    # add a legend to the main plot window and some subpanels
    add_legend(axes, ap_list, 0, ptype=ptype)
    for panel in legend_needed:
        add_legend(axes, ap_list, panel)
    ....


def add_legend(axes, add_plots, panel, primary_label='', ptype=None, loc='upper left'):
    labels = []

    # set label for main panel primary data series
    if panel == 0:
        if primary_label == '':
            primary_label = 'AdjOHLC' if ptype == 'ohlc' or ptype == 'candle' else 'AdjClose'
        labels.append(primary_label)

    # grab labels from the add plots attached to the specified panel
    for ap_data in [ap['data'] for ap in add_plots if ap['panel'] == panel]:
        if isinstance(ap_data, pd.Series):
            labels.append(ap_data.name)
        elif isinstance(ap_data, pd.DataFrame):
            labels += list(ap_data.columns)

    # need to use offsets to get correct ax and handles based on figure structure
    ax_offset = 2 if panel > 0 else 0
    handle_offset = 2 if ptype == 'ohlc' else 1 if ptype == 'candle' else 0

    # add the legend
    axes[panel + ax_offset].legend([None] * (len(labels) + handle_offset))
    handles = axes[panel + ax_offset].get_legend().legendHandles
    axes[panel + ax_offset].legend(handles=handles[handle_offset:], labels=labels, loc=loc)

@TraderMan999
Copy link

TraderMan999 commented Jun 25, 2023

this helped BUT how do i get proper colors on other panels ....lost a whole day experimenting , no luck. thanks in advance

The problem, I think, is in this line of code:

fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), 
                     addplot=list(ap2.values()),  style='charles', savefig=save)

change savefig to returnfig=True :

fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), 
                     addplot=list(ap2.values()),  style='charles', returnfig=True)

ap3 = {

    "SuperTrend_Long": mpf.make_addplot(df['SUPERTl'].tail(tail_num), color='g'),
    "SuperTrend_Short": mpf.make_addplot(df['SUPERTs'].tail(tail_num), color='r'),
    "PSAR_Long": mpf.make_addplot(df['PSARl'].tail(tail_num), color='y'),
    "PSAR_Short": mpf.make_addplot(df['PSARs'].tail(tail_num), color='y'),
    "EMA_15": mpf.make_addplot(df['EMA_15'].tail(tail_num),  color='#000055'),
    "EMA_20": mpf.make_addplot(df['EMA_20'].tail(tail_num),  color='#000099'),
    "EMA_30": mpf.make_addplot(df['EMA_30'].tail(tail_num),  color='#0000CC'),
    "EMA_50": mpf.make_addplot(df['EMA_50'].tail(tail_num),  color='#005500'),
    "EMA_75": mpf.make_addplot(df['EMA_75'].tail(tail_num),  color='#00CC00'),
    "EMA_100": mpf.make_addplot(df['EMA_100'].tail(tail_num),  color='#990000'),
    "EMA_200": mpf.make_addplot(df['EMA_200'].tail(tail_num),  color='#CC0000'),
    "stochrsi_K": mpf.make_addplot(df['stochrsi_K_ultragtx'].tail(tail_num), color='g', panel=2),  # panel 2 specified
    "stochrsi_D": mpf.make_addplot(df['stochrsi_D_ultragtx'].tail(tail_num), color='b', panel=2),  # panel 2 specified
    "MACDh": mpf.make_addplot(df['MACDh_6_12_9'].tail(tail_num), color='r', secondary_y=True, panel=3),
    "MACDs": mpf.make_addplot(df['MACDs_6_12_9'].tail(tail_num), color='b', secondary_y=True, panel=3)
}
print('making axes0 legend')
fig, axes = mpf.plot(df.tail(tail_num), type='candle', volume=True,  addplot=list(ap3.values()),  style='charles',
                     returnfig=True, title=('Last '+str(tail_num)+' candles'+fname), scale_width_adjustment=dict(lines=0.25))
axes[0].legend([None]*(len(ap3)+2))
handles = axes[0].get_legend().legendHandles
axes[0].legend(handles=handles[2:], labels=list(ap3.keys()), loc='upper left', fontsize='x-small')
#axes[0].legend(loc='upper left', fontsize='x-small')
# IPydisplay.Image(ourpath)
print(axes)
axes[4].set_ylabel("MACD")
axes[6].set_ylabel("StochRSI")
print(axes)
print(len(ap3))
try:
    axes[4].legend([None]*(len(ap3)+2))

    axes[4].legend(handles=handles[2:], labels=['MACDh', 'MACDs'], loc='center left', fontsize='x-small')
except Exception as e:
    print('error making legend axis4')
    print(e)
print('making axes6 legend')
try:
    # axes[6].legend([None]*(len(ap3)+2))
    # axes[6].legend([None]*(2+2))
    #handles6 = axes[6].get_legend().legendHandles
    axes[6].legend(handles=handles[2:], labels=['stochrsi_K', 'stochrsi_D'], loc='center left', fontsize='x-small')
except Exception as e:
    print('error making legend axis6')
    print(e)
fig.savefig('plots/'+fname, dpi=300)

2022-06-23_23_00_00_UTC_BTC-USDT_1h

you see ax6 , the stochrsi subplot on the bottom....i dont understand how to reference that handles of legend should be the correct colors. its obviuosly giving the colors of the top panels first 2...but no matter what i tried n read in the docs, i couldnt find examples both ref'd panels legend and from a addplot list. thanks

wow! How do you get the candles etc so crips in your image from the mplfinance save file? would love mine to look like this.

As an example, here's what my candles look like. not bad but it's not the view that i want and struggling to make it look crisper and larger in context of the overall saved image. also want to add the legend.

https://ibb.co/g6cVcy8

Heres the code im using to save the file but it's still not quite right:
mpf.plot(data, type='candle', style='yahoo', title=title,savefig=dict(fname=savedPlotFileName,dpi=400,pad_inches=0.0), hlines=dict(hlines=[fib_62, fib_705, fib_79,fib_21, fib_295, fib_38],colors=['r','g','r','r','g','r'],linestyle='-.'), fill_between=dict(y1=minlow,y2=minhigh,where=where_values, alpha=0.5, color='g'))

Is there any updates on the LEGENDS capability within the package yet?

@DavidT-123
Copy link

DavidT-123 commented Jun 26, 2023 via email

@TraderMan999
Copy link

You need to get the handles from the same subplot where you are intending to define the legend. In your code you have: handles = axes[0].get_legend().legendHandles which you use for the main plot, but when moving on to the subplots, you did not grab the handles again from those axes...

On Jun 25, 2023, at 5:32 PM, TraderMan999 @.> wrote: this helped BUT how do i get proper colors on other panels ....lost a whole day experimenting , no luck. thanks in advance The problem, I think, is in this line of code: fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), addplot=list(ap2.values()), style='charles', savefig=save) change savefig to returnfig=True : fig, axes = mpf.plot(df.tail(200), type='candle', volume=True, mav=(26, 50, 75, 100, 150), addplot=list(ap2.values()), style='charles', returnfig=True) ap3 = { "SuperTrend_Long": mpf.make_addplot(df['SUPERTl'].tail(tail_num), color='g'), "SuperTrend_Short": mpf.make_addplot(df['SUPERTs'].tail(tail_num), color='r'), "PSAR_Long": mpf.make_addplot(df['PSARl'].tail(tail_num), color='y'), "PSAR_Short": mpf.make_addplot(df['PSARs'].tail(tail_num), color='y'), "EMA_15": mpf.make_addplot(df['EMA_15'].tail(tail_num), color='#55'), "EMA_20": mpf.make_addplot(df['EMA_20'].tail(tail_num), color='#99'), "EMA_30": mpf.make_addplot(df['EMA_30'].tail(tail_num), color='#0000CC'), "EMA_50": mpf.make_addplot(df['EMA_50'].tail(tail_num), color='#005500'), "EMA_75": mpf.make_addplot(df['EMA_75'].tail(tail_num), color='#00CC00'), "EMA_100": mpf.make_addplot(df['EMA_100'].tail(tail_num), color='#990000'), "EMA_200": mpf.make_addplot(df['EMA_200'].tail(tail_num), color='#CC0000'), "stochrsi_K": mpf.make_addplot(df['stochrsi_K_ultragtx'].tail(tail_num), color='g', panel=2), # panel 2 specified "stochrsi_D": mpf.make_addplot(df['stochrsi_D_ultragtx'].tail(tail_num), color='b', panel=2), # panel 2 specified "MACDh": mpf.make_addplot(df['MACDh_6_12_9'].tail(tail_num), color='r', secondary_y=True, panel=3), "MACDs": mpf.make_addplot(df['MACDs_6_12_9'].tail(tail_num), color='b', secondary_y=True, panel=3) } print('making axes0 legend') fig, axes = mpf.plot(df.tail(tail_num), type='candle', volume=True, addplot=list(ap3.values()), style='charles', returnfig=True, title=('Last '+str(tail_num)+' candles'+fname), scale_width_adjustment=dict(lines=0.25)) axes[0].legend([None](len(ap3)+2)) handles = axes[0].get_legend().legendHandles axes[0].legend(handles=handles[2:], labels=list(ap3.keys()), loc='upper left', fontsize='x-small') #axes[0].legend(loc='upper left', fontsize='x-small') # IPydisplay.Image(ourpath) print(axes) axes[4].set_ylabel("MACD") axes[6].set_ylabel("StochRSI") print(axes) print(len(ap3)) try: axes[4].legend([None](len(ap3)+2)) axes[4].legend(handles=handles[2:], labels=['MACDh', 'MACDs'], loc='center left', fontsize='x-small') except Exception as e: print('error making legend axis4') print(e) print('making axes6 legend') try: # axes[6].legend([None](len(ap3)+2)) # axes[6].legend([None]*(2+2)) #handles6 = axes[6].get_legend().legendHandles axes[6].legend(handles=handles[2:], labels=['stochrsi_K', 'stochrsi_D'], loc='center left', fontsize='x-small') except Exception as e: print('error making legend axis6') print(e) fig.savefig('plots/'+fname, dpi=300) https://user-images.githubusercontent.com/97939226/175432610-9a387d8d-42ea-465c-83b5-b688073dffa7.png you see ax6 , the stochrsi subplot on the bottom....i dont understand how to reference that handles of legend should be the correct colors. its obviuosly giving the colors of the top panels first 2...but no matter what i tried n read in the docs, i couldnt find examples both ref'd panels legend and from a addplot list. thanks wow! How do you get the candles etc so crips in your image from the mplfinance save file? would love mine to look like this. As an example, here's what my candles look like. not bad but it's not the view that i want and struggling to make it look crisper and larger in context of the overall saved image. also want to add the legend. https://ibb.co/g6cVcy8 https://ibb.co/g6cVcy8 Is there any updates on the LEGENDS capability within the package yet? — Reply to this email directly, view it on GitHub <#181 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AD4NKOSLOV2EY6YFEQRXGELXNC4AXANCNFSM4OCESKDQ. You are receiving this because you commented.

i think youre responding to the code i copied from someone else

@TraderMan999
Copy link

TraderMan999 commented Jun 26, 2023

https://ibb.co/g6cVcy8

Can anyone suggest what i can do different to make these candles appear relatively bigger on this image? ive spent hours changing the various figsize parameters, dpi, figscale, etc to no avail. Here's some sample code.

mpf.plot(data,figscale=1.25,style='yahoo',type='candle',
               update_width_config=dict(candle_linewidth=0.4),
               title=newtitle,savefig=dict(fname='./flashcards/' + savedPlotFileName,dpi=400,bbox_inches='tight'),
                #hlines=dict(hlines=[midnightOpen,londonhigh,londonlow,
                #                                fib_62, fib_705, fib_79,fib_21, fib_295, fib_38],
                #                                colors=['b','g','r','r','g','k','r','g','k']),
                hlines=dict(hlines=[midnightOpen, londonhigh, londonlow],
                                               colors=['b', 'g', 'r', 'r', 'g', 'k'],
                                               linewidths=(1, 1, 1, 1, 1, 1),
                                               linestyle=['dotted', 'dotted', 'dotted']),
                fill_between=dict(y1=minlow,y2=minhigh,where=where_values, alpha=0.5, color='g'))

image

@DanielGoldfarb
Copy link
Collaborator

There are a few things you can try, lsited here in the order of what I suspect is most likely to help:

  1. For sure getting rid of the lower hlines and possibly setting ylim=(4075,4175) will help. By the way, the code you posted doesn't seem to match the plot image that you posted.
  2. resample to plot fewer candles. click here for more information
  3. scale_width_adjustment=dict(candle=1.35) (play with various values to see what works best)
  4. Play around with various figscale= values. Sometimes making this larger, or even smaller, can improve candle appearance.
  5. Similarly playing with different values of dpi may (or may not) help.

@TraderMan999
Copy link

TraderMan999 commented Jun 27, 2023

There are a few things you can try, lsited here in the order of what I suspect is most likely to help:

  1. For sure getting rid of the lower hlines and possibly setting ylim=(4075,4175) will help. By the way, the code you posted doesn't seem to match the plot image that you posted.
  2. resample to plot fewer candles. click here for more information
  3. scale_width_adjustment=dict(candle=1.35) (play with various values to see what works best)
  4. Play around with various figscale= values. Sometimes making this larger, or even smaller, can improve candle appearance.
  5. Similarly playing with different values of dpi may (or may not) help.

thanks let me give that a try.

weird i think youre right. i must have made a copy / paste error. let me post below for clarification
oops i see what i did. i grabbed the wrong image url for the post. ive posted the correct one here below

https://ibb.co/NK0GYCq

The lower hlines are fibs im tracking but ive pondered the value of having them there when the actual candles are so far from them so that could also be a compromise with a little if then else logic i can add

AND AS ALWAYS THANK YOU FOR THE QUICK RESPONSE. I LOVE HOW ENGAGED YOU ARE IN YOUR PRODUCT FOR YOUR USER COMMUNITY. ONE OF THE BEST!

@TraderMan999
Copy link

The ylim definitely helped. i can probably live with that. thanks for that suggestion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests