如何用字典创建华夫饼图?
How to create a waffle chart with a dictionary?
我正在通过 Jupyter 实验室学习 Python,但我遇到了 Waffle 图表的问题。
我有以下字典,我想将其显示为华夫饼图:
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()
然而,结果出人意料:
相反,图表应该看起来像这样。我做错了什么?
实际上,您的代码是正确的,Waffle 正确显示了您的数据(在您的图中放大以查看正方形...)
但是,要获得所需的输出,您必须使用参数 "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()
请注意,waffle 在内部应用了一些舍入(请参阅参数 rounding_rule
),这就是为什么 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()
或者,您可以规范化数据,使值的总和为 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
# ...
这两个代码选项可以解决我的问题:
1.来自 Mr.Normanius 的贡献:
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()
结果如下:
我正在通过 Jupyter 实验室学习 Python,但我遇到了 Waffle 图表的问题。
我有以下字典,我想将其显示为华夫饼图:
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()
然而,结果出人意料:
相反,图表应该看起来像这样。我做错了什么?
实际上,您的代码是正确的,Waffle 正确显示了您的数据(在您的图中放大以查看正方形...)
但是,要获得所需的输出,您必须使用参数 "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()
请注意,waffle 在内部应用了一些舍入(请参阅参数 rounding_rule
),这就是为什么 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()
或者,您可以规范化数据,使值的总和为 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
# ...
这两个代码选项可以解决我的问题:
1.来自 Mr.Normanius 的贡献:
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()
结果如下: