Problem with Font awesome on VsCode
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.

I am not able to reproduce this issue, and I got following result
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?
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.
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.

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()

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

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).
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.
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}
)

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 Yes, it seems to be a problem with matplotlib on windows.
Did anyone ever fix this?
Please help me. I'm in the same situation too.
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()