PyWaffle icon indicating copy to clipboard operation
PyWaffle copied to clipboard

Problem with Font awesome on VsCode

Open MalikQasimAli opened this issue 3 years ago • 11 comments

I have a strange problem with the PyWaffle library. I am running the examples and everything is working fine except the examples with fontawesome.

I am running the following code and the result shows distorted picture.

dict_users = {'Regular': 62, 'New': 20, 'Churned': 16, 'Suspended': 2}
df = pd.Series(dict_users)
colors_list = ['slateblue', 'limegreen', 'red', 'grey']
colors = {df.index[i]:colors_list[i] for i in range(len(df))}
fig = plt.figure(FigureClass=Waffle,
                 figsize=(10,5),
                 values=dict_users,
                 rows=10,
                 colors=list(colors.values()),
                 icons=['user','user-plus', 'user-minus', 'user-clock'],
                 font_size=15,
                 icon_legend=True,
                 legend={'bbox_to_anchor': (1.55, 1), 'fontsize': 15, 'frameon': False})              
plt.title('User dynamics in July 2021', fontsize=20)
plt.show()

I am also having the the following warning message : IPython\core\pylabtools.py:151: UserWarning: Tight layout not applied. The bottom and top margins cannot be made large enough to accommodate all axes decorations. fig.canvas.print_figure(bytes_io, **kw)

I also tried to use the command fig.set_tight_layout(False)
but the warning message did not go away.

output

MalikQasimAli avatar Jan 20 '23 00:01 MalikQasimAli

I am not able to reproduce this issue, and I got following result

Screenshot 2023-01-25 at 10 06 10 PM

The libraries I am testing: fontawesomefree 6.2.1 matplotlib 3.6.3 pywaffle 1.1.0

Could you share more details of the library versions, and how it was executed?

gyli avatar Jan 26 '23 03:01 gyli

I have the same problem, I had installed matplotlib 3.6.3 fontawesomefree 6.3.0 pywaffle 1.1.0

but I tried it also with fontawesomefree 6.2.1. For changing the version, I followed the instructions on the website.

I executed this in a Jupyter Notebook in VSCode with python 3.10.0. Plotting characters works fine, the problem only occurs when plotting icons.

Langhammer avatar Feb 20 '23 13:02 Langhammer

Hi @MalikQasimAli and @Langhammer , could you share more info other than versions of matplotlib, fontawesomefree and pywaffle, like VS code version and platform?

I am still not able to reproduce this issue with versions same as Langhammer mentioned above. Python 3.10.0, matplotlib 3.6.3, fontawesomefree 6.3.0, and pywaffle 1.1.0 in VS Code notebook. Screenshot 2023-02-20 at 9 14 34 PM

gyli avatar Feb 21 '23 02:02 gyli

I can reproduce the problem on my machine with matplotlib 3.5.3, while with matplotlib 3.5.2 it works well. Python 3.7.4, Windows 10 with PyCharm.

The issue can be simplified to the following, where the icon is rendered much too large.

from matplotlib import pyplot as plt
import matplotlib.font_manager as fm

prop = fm.FontProperties(size=20)
prop.set_file('C:\\Projects\\test\\venv\\lib\\site-packages\\fontawesomefree\\static\\fontawesomefree\\otfs\\Font Awesome 6 Free-Solid-900.otf')
plt.text(0.5, 0.5, 'a', fontproperties=prop)
plt.show()

image

Setting the fontsize to something small doesn't really help; it renders some garbled lines. Here is what happens with size 1: image

jhncls avatar Feb 28 '23 17:02 jhncls

I am having exactly the same problem. I asked a question on StackOverflow and another user redirected me here.

Below is some information about the modules I am using:

Name: pywaffle
Version: 1.1.0
Summary: PyWaffle is an open source, MIT-licensed Python package for plotting waffle charts.
Home-page: https://github.com/gyli/PyWaffle
Author: Guangyang Li
Author-email: [email protected]
License: MIT
Location: C:\Users\harry\AppData\Roaming\Python\Python311\site-packages
Requires: fontawesomefree, matplotlib
Required-by:
---
Name: fontawesomefree
Version: 6.1.1
Summary: Font Awesome Free
Home-page: https://github.com/FortAwesome/Font-Awesome
Author: Font Awesome
Author-email: [email protected]
License: UNKNOWN
Location: C:\Users\harry\AppData\Roaming\Python\Python311\site-packages
Requires:
Required-by: pywaffle
---
Name: matplotlib
Version: 3.7.0
Summary: Python plotting package
Home-page: https://matplotlib.org
Author: John D. Hunter, Michael Droettboom
Author-email: [email protected]
License: PSF
Location: C:\Users\harry\AppData\Roaming\Python\Python311\site-packages
Requires: contourpy, cycler, fonttools, kiwisolver, numpy, packaging, pillow, pyparsing, python-dateutil
Required-by: ipympl, pywaffle

I attempted to uninstall the matplotlib-3.7.0 and reinstall matplotlib-3.5.2 to see if it would work for me as well, but it raised a legacy-install-failure (see the log below for details).

ErrorLog_2023-02-28.txt

So, does this mean that there is a compatibility issue between versions of matplotlib after 3.5.2 and pywaffle-1.1.0?

EDIT: For clarification, it does not make a difference whether I run a Python script through PowerShell, run a JupyterNotebook in the browser or a JupyterNotebook through Visual Studio Code; I get the same problem.

Rustic-Citrus avatar Feb 28 '23 21:02 Rustic-Citrus

I run a jupyter notebook in vscode 1.75.1. Interestingly, it works on binder with the same requirements.txt. this time I am using matplotlib 3.7.0. A small example:

from matplotlib import pyplot as plt
from pywaffle import Waffle

fig = plt.figure(
    FigureClass=Waffle,
    rows=1,
    icons='person',
    font_size=3,
    values={'a':1, 'b':2, 'c':3}
)

grafik

Langhammer avatar Feb 28 '23 21:02 Langhammer

Based on @jhncls's finding, we can basically narrow root cause down to rendering font awesome in matplotlib. I also guess that it only happens on Windows, since that is all the cases reported above, and I am not able to reproduce it with 2 mac that I own.

His testing codes

from matplotlib import pyplot as plt
import matplotlib.font_manager as fm

prop = fm.FontProperties(size=20)
prop.set_file('C:\\Projects\\test\\venv\\lib\\site-packages\\fontawesomefree\\static\\fontawesomefree\\otfs\\Font Awesome 6 Free-Solid-900.otf')
plt.text(0.5, 0.5, 'a', fontproperties=prop)
plt.show()

outputs the correct result on my end. So could you submit this issue on matplotlib repo?

cc @Langhammer @MalikQasimAli @Rustic-Citrus

gyli avatar Mar 03 '23 03:03 gyli

@gyli Yes, it seems to be a problem with matplotlib on windows.

Langhammer avatar Mar 07 '23 13:03 Langhammer

Did anyone ever fix this?

mwelford-r1 avatar Dec 03 '24 20:12 mwelford-r1

Please help me. I'm in the same situation too.

459838764 avatar Apr 21 '25 11:04 459838764

I found a workaround! The idea is to read fontawesome font directly from URL using pyfonts package and instead of calling icons in pywaffle, use characters combined with font_file. Unfortunately you need to look up the UTF codes of the icons manually. I am on Windows 11, Jupyter 7 with Nbclassic, MPL 3.10.0 and it fixed the problem for me.

import pandas as pd
from pywaffle import Waffle
import matplotlib.pyplot as plt

from pyfonts import load_font

font_fa_solid = load_font(
    'https://github.com/FortAwesome/Font-Awesome/raw/refs/heads/7.x/otfs/Font%20Awesome%207%20Free-Solid-900.otf'
)
font_fa_solid.set_weight('900') # need to do this for Solid icons 

font_fa_regular = load_font(
    'https://github.com/FortAwesome/Font-Awesome/raw/refs/heads/7.x/otfs/Font%20Awesome%207%20Free-Regular-400.otf'
)



dict_users = {'Regular': 62, 'New': 20, 'Churned': 16, 'Suspended': 2}
df = pd.Series(dict_users)
colors_list = ['slateblue', 'limegreen', 'red', 'grey']
colors = {df.index[i]:colors_list[i] for i in range(len(df))}
fig = plt.figure(FigureClass=Waffle,
                 figsize=(10,5),
                 values=dict_users,
                 rows=10,
                 colors=list(colors.values()),
                 characters=['\uf007','\uf234', '\uf503', '\uf4fd'],
                 font_size=15,
                 font_file = font_fa_solid.get_file(), #pick the desired font file here
                 legend={'bbox_to_anchor': (1.55, 1), 'fontsize': 15, 'frameon': False})              
plt.title('User dynamics in July 2021', fontsize=20)
plt.show()

paniterka avatar Oct 20 '25 21:10 paniterka