matplotlib / matplotlib/mplfinance

Using with `matplotlib.testing.decorators.image_comparison`

Aperta
#661 6 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

question
Lingua principale
Python
Stelle
4.4k
Fork
678
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

The problem is that the baseline images generated locally (in a Dev Container) don't match the ones on CI (GitHub Actions running the latest Ubuntu LTS) and thus my tests fail. When I compared the images I figured out that different fonts are being used: CI's Ubuntu has more fonts pre-installed than a Dev Container so the text was rendered with `Liberation Sans` instead of `DejaVu Sans`.

To quick fix it:

1. Install Liberation fonts locally
`sudo apt install fonts-liberation`
2. Drop `matplotlib` fonts cache (file location and name can be different)
`rm ~/.cache/matplotlib/fontlist-v330.json`
4. Re-generate baseline images

Also to find a solution that won't fail when some font is added/removed locally/remotely, I dug deeper and figured out that `matpltolib` has a solution for this well-known issue: [matplotlib.testing.setup()](https://github.com/matplotlib/matplotlib/blob/v3.8.3/lib/matplotlib/testing/__init__.py#L28) that calls [set_font_settings_for_testing()](https://github.com/matplotlib/matplotlib/blob/v3.8.3/lib/matplotlib/testing/__init__.py#L18) that sets `font.family` to `DejaVu Sans`.

But for `mplfinance` that makes no difference because the `font.family` gets overridden by [_apply_mpfstyle](https://github.com/matplotlib/mplfinance/blob/e0eaa075ca4dfb81246c4074d58380fdb1f3c9a8/src/mplfinance/_styles.py#L19) call. For example, the `default` style sets it to `sans-serif` (comes from `base_mpl_style='seaborn-darkgrid'`), and then nobody knows which font `maptlotlib` is going to use for rendering.

Here I came up with two solutions:

### `pytest` fixture

Pros:
- uses only public API

Cons:
- need to pass to every `.plot(...)`

```py
@pytest.fixture
def mpf_style():
return mpf.make_mpf_style(
base_mpf_style="default", rc={"font.family": "DejaVu Sans"}
)

@image_comparison(baseline_images=["test.png"])
def test(mpf_style):
mpf.plot(..., style=mpf_style)
```

### `pytest` before-all hook that mutates `default` style

Pros:
- all the existing tests left untouched
- never forget passing `style=...` in new ones

Cons:
- gets broken on the underlying `mplfinance` implementation changes

```py
def pytest_configure() -> None:
mpf._styledata.default.style["rc"].append(("font.family", "DejaVu Sans"))
```

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia leggendo src/mplfinance/_styles.py, in particolare _apply_mpfstyle, e confrontalo con matplotlib.testing.setup() e set_font_settings_for_testing(). Esamina i test di confronto delle immagini e determina quale approccio mantiene coerenti i font renderizzati tra i Dev Containers locali e GitHub Actions senza richiedere che ogni test passi uno stile personalizzato; il lavoro è completato quando i confronti di baseline esistenti hanno esito positivo in entrambi gli ambienti.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
matplotlib, python
Ambito
data-visualization, testing
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.