has2k1 / plotnine

A Grammar of Graphics for Python
https://plotnine.org
MIT License
3.89k stars 209 forks source link

Named Reverse colormaps not available anymore #778

Closed AlFontal closed 2 months ago

AlFontal commented 2 months ago

I tested this on the current version of Plotnine (0.13.4.post15+g9e8664d) and mizani 0.11.1:

Whenever I try to use the '_r' suffix to named colormaps to reverse the values of any named colormap available in the matplotlib colormaps, which has always been possible in previous versions of plotnine, a value error is thrown due to Uknown colormap.

Reproducible example

Normal named colormap works:

(p9.ggplot(mtcars, p9.aes(x='wt', y='mpg', color='mpg')) 
 + p9.geom_point()
 + p9.scale_color_cmap('RdBu')
)

image

The reverse doesn't:

(p9.ggplot(mtcars, p9.aes(x='wt', y='mpg', color='mpg')) 
 + p9.geom_point()
 + p9.scale_color_cmap('RdBu_r')
)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
File [~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:57](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:57), in _colormap_lookup.__getitem__(self, name)
     [56](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:56) try:
---> [57](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:57)     return self.d[name]
     [58](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:58) except KeyError as err:

KeyError: 'RdBu_r'

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
Cell In[7], [line 3](vscode-notebook-cell:?execution_count=7&line=3)
      [1](vscode-notebook-cell:?execution_count=7&line=1) (p9.ggplot(mtcars, p9.aes(x='wt', y='mpg', color='mpg')) 
      [2](vscode-notebook-cell:?execution_count=7&line=2)  + p9.geom_point()
----> [3](vscode-notebook-cell:?execution_count=7&line=3)  + p9.scale_color_cmap('RdBu_r')
      [4](vscode-notebook-cell:?execution_count=7&line=4) )

File [~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/plotnine/scales/scale_color.py:477](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/plotnine/scales/scale_color.py:477), in scale_color_cmap.__init__(self, cmap_name, **kwargs)
    [474](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/plotnine/scales/scale_color.py:474) from mizani.palettes import cmap_pal
    [476](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/plotnine/scales/scale_color.py:476) # TODO: fix types in mizani
--> [477](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/plotnine/scales/scale_color.py:477) self.palette = cmap_pal(cmap_name)  # pyright: ignore
    [478](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/plotnine/scales/scale_color.py:478) super().__init__(**kwargs)

File <string>:4, in __init__(self, name)

File [~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/palettes.py:565](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/palettes.py:565), in cmap_pal.__post_init__(self)
    [564](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/palettes.py:564) def __post_init__(self):
--> [565](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/palettes.py:565)     self.cm = get_colormap(self.name)

File [~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:82](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:82), in get_colormap(name)
     [78](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:78) def get_colormap(name: str) -> ColorMap:
     [79](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:79)     """
     [80](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:80)     Return colormap
     [81](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:81)     """
---> [82](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:82)     return COLORMAPS[name]

File [~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:59](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:59), in _colormap_lookup.__getitem__(self, name)
     [57](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:57)     return self.d[name]
     [58](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:58) except KeyError as err:
---> [59](https://file+.vscode-resource.vscode-cdn.net/Users/alejandro/projects/kd-spatial-ts/project/~/miniconda3/envs/kd-spatial-ts/lib/python3.10/site-packages/mizani/_colors/named_colors.py:59)     raise ValueError(f"Unknow colormap: {name}") from err

ValueError: Unknow colormap: RdBu_r

Yet the named colormap is available directly within matplotlib, because I am able to do the following without any errors whatsoever:

import matplotlib.pyplot as plt
plt.scatter(x='wt', y='mpg', c='mpg', data=mtcars, cmap='RdBu_r')
plt.show()

image

It doesn't seem to be an error coming simply from this colormap but ubiquitous for all of them!

has2k1 commented 2 months ago

The fix has been released in mizani v0.11.2.