matplotlib / matplotlib/mplfinance

mplfinance default values rise error in plot function

Open
#681 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

question
Dominant language
Python
Stars
4.4k
Forks
678
PR merge metrics
No merged PRs in 30d

Description

Hi!
First of all, thank you for such useful library for plotting candles!

I'm trying to process a scenario, when `addplot` and `alines` is empty (at the present moment `buys` and `sells` lists have only one point in format `['date','price']`, but it doesn't matter for question). So my function, that builds a graph is:

```python
def mplfplotcoin(df,title,
buys=[],
sells=[],
rsi=False):

adp = []

# adding trades
if buys:
buysdf = pd.DataFrame([buys],columns=['Date', 'OpenPrice']) # when buys list consists of one point
buysdf = df.merge(buysdf,on='Date',how='left')['OpenPrice'] # left join
addbuys = mpf.make_addplot(buysdf,scatter=True,markersize=300,marker=6,color='forestgreen',alpha=0.75) # buy markers
adp.append(addbuys)
if sells:
sellsdf = pd.DataFrame([sells], columns=['Date', 'ClosePrice']) # when sells list consists of one point
sellsdf = df.merge(sellsdf,on='Date',how='left')['ClosePrice'] # left join
addsells = mpf.make_addplot(sellsdf,scatter=True,markersize=300,marker=7,color='firebrick',alpha=0.75) # sell markers
adp.append(addsells)

# adding line between trades https://github.com/matplotlib/mplfinance/blob/master/examples/using_lines.ipynb
if len(buys) == len(sells) and buys: # I know it's awful))) I'll change it later
tradeline = dict(alines=[tuple(buys),tuple(sells)],colors='lightslategray',linestyle='--',linewidths=2,alpha=0.5)
else: tradeline = None

# adding rsi
if rsi:
addrsi = mpf.make_addplot((df['rsi']),panel=1,type='line',color='orange',width=1,ylabel='rsi',ylim=(-5,105))
adp.append(addrsi)

# checking adp list
if not adp: adp = None

# drawing
mpf.plot(df,
type='candle',
style='tradingview',
volume=True,
show_nontrading=True,
addplot=adp,
alines=tradeline,
figscale=1.3,
title=title,
ylabel='USDT')
```

so, lines `else: tradeline = None` and `if not adp: adp = None` are like this, because I found it in your library file `plottin.py`:
```python
#211 line:
'addplot' : { 'Default' : None,
'Description' : 'addplot object or sequence of addplot objects (from `mpf.make_addplot()`)',
'Validator' : lambda value: isinstance(value,dict) or (isinstance(value,list) and all([isinstance(d,dict) for d in value])) },

# 267 line:
'alines' : { 'Default' : None,
'Description' : 'Draw one or more ARBITRARY LINES anywhere on the plot, by'+
' specifying a sequence of two or more date/price pairs, or by'+
' specifying a sequence of sequences of two or more date/price pairs.'+
' May also be a dict with key `alines` (as date/price pairs described above),'+
' plus one or more of the following keys:'+
' `colors`, `linestyle`, `linewidths`, `alpha`.',
```

however I get errors for `mpf.plot(..., addplot=adp, alines=tradeline, ...)`:
```python
TypeError: kwarg "addplot" validator returned False for value: "None"
'Validator' : lambda value: isinstance(value,dict) or (isinstance(value,list) and all([isinstance(d,dict) for d in value])) },
```
and the same for `alines` parameter:
```python
TypeError: kwarg "alines" validator returned False for value: "None"
'Validator' : lambda value: _alines_validator(value) },
```

If I go to `plotting.py`, I can't understand why error is rised, because there is only one `if` about `addplot is None`:
```python
# 739 line
addplot = config['addplot']
if addplot is not None and ptype not in VALID_PMOVE_TYPES:
...

# and then 816 line is new condition:
# fill_between is NOT supported for external_axes_mode
# (caller can easily call ax.fill_between() themselves).
if config['fill_between'] is not None and not external_axes_mode:
...
```

Ok, I tried to define `ptype` in my code:
```python
# checking adp list
if not adp: adp = [mpf.make_addplot(None,type='line')]
```

But again error:
```python
raise TypeError('Wrong type for data, in make_addplot()')
TypeError: Wrong type for data, in make_addplot()
```

Please, help me to understand how to draw plot if `addplot` and `alines` (and other kwards) are empty?

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in plotting.py at the addplot and alines configuration validators cited in the report, then follow how those options are passed into mpf.plot(). Reproduce the call with both options empty and compare it with a normal candle plot. Done means an empty addplot and alines configuration is accepted without validator errors and the plot still renders.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data-visualization
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.