gyli / PyWaffle

🧇 Make Waffle Charts in Python.
MIT License
578 stars 105 forks source link

Problem with Font awesome on VsCode #33

Open MalikQasimAli opened 1 year ago

MalikQasimAli commented 1 year ago

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

gyli commented 1 year ago

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?

Langhammer commented 1 year ago

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.

gyli commented 1 year ago

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
jhncls commented 1 year ago

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

Rustic-Citrus commented 1 year ago

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: mail@guangyangli.com
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: hello@fontawesome.com
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: matplotlib-users@python.org
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.

Langhammer commented 1 year ago

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

gyli commented 1 year ago

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

Langhammer commented 1 year ago

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