如何使用字典创建华夫格图表?

2024-05-16 10:43:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过Jupyter实验室学习Python,我面临着华夫格图表的问题

我有以下字典,我想显示为华夫格图表:

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

dic = {'Xemay':150,'Xedap':20,'Oto':180,'Maybay':80,'Tauthuy':135,'Xelua':5}
df = pd.DataFrame.from_dict(dic, orient='index')

plt.figure(FigureClass=Waffle,rows=5,values=dic,legend={'loc': 'upper left', 'bbox_to_anchor': (1, 1)})
plt.title('Số lượng xe bán được của một công ty')
plt.show()

然而,结果出乎意料:

Screenshot1

相反,图表应该是这样的。我做错了什么

Screenshot2


Tags: fromimportpandas字典matplotlibas图表jupyter
2条回答

实际上,您的代码是正确的,华夫格正确地显示了您的数据(放大绘图以查看正方形…)

但是,为了获得所需的输出,您必须使用参数“rows”和“columns”,它们指定华夫格图表的尺寸

nRows=5
countsPerBlock=10  # 1 block = 10 counts
plt.figure(FigureClass=Waffle,
           rows=nRows,
           columns=int(np.ceil(sum(dic.values())/nRows/countsPerBlock)),
           values=dic,
           legend={'loc': 'upper left', 'bbox_to_anchor': (1, 1.1)})
plt.show()

Screenshot solution 2

注意,waffle在内部应用了一些舍入(请参见参数^{}),这就是为什么countsPerBlock不是完全正确的,除非您自己缩放数据。要准确再现所需输出,请使用以下代码:

nRows = 5
countsPerBlock = 10
keys = ['Xemay', 'Xedap', 'Oto', 'Maybay', 'Tauthuy', 'Xelua']
vals = np.array([150, 20, 180, 80, 135, 5])
vals = np.ceil(vals/countsPerBlock)
data = dict(zip(keys, vals))

plt.figure(FigureClass=Waffle,
           rows=5,
           values=data,
           legend={'loc': 'upper left', 'bbox_to_anchor': (1, 1)})
plt.show()

Screenshot solution final

或者,您可以规范化数据,使值之和为100。在5x20正方形中,一个正方形代表您数据的1%

# Create a dict of normalized data. There are plenty of 
# ways to do this. Here is one approach:
keys = ['Xemay', 'Xedap', 'Oto', 'Maybay', 'Tauthuy', 'Xelua']
vals = np.array([150, 20, 180, 80, 135, 5])
vals = vals/vals.sum()*100
data = dict(zip(keys, vals))
nRows = 5
# ...

Screenshot solution final

这两个代码选项可以解决我的问题:

1。诺曼纽斯先生的贡献:

nRows = 5
countsPerBlock = 10
keys = ['Xemay', 'Xedap', 'Oto', 'Maybay', 'Tauthuy', 'Xelua']
vals = np.array([150, 20, 180, 80, 135, 5])
vals = np.ceil(vals/countsPerBlock)
data = dict(zip(keys, vals))

plt.figure(FigureClass=Waffle,
           rows=5,
           values=data,
           legend={'loc': 'upper left', 'bbox_to_anchor': (1, 1)})
plt.show()

2。据我所知:

fig = plt.figure(
    FigureClass=Waffle, 
    rows=5, 
    values=df[0]/10, 
    title={'label': 'So luong xe duoc ban cua mot cong ty', 'loc': 'left'},
    labels=df.index.tolist(),
    legend={'loc': 'lower right', 'bbox_to_anchor': (1, 0.5)}
)
plt.show()

结果如下: enter image description here

相关问题 更多 >