从颜色链接到索引值的数据框创建一系列饼图
Creating a series of pie charts from a dataframe with color linked to indexes's values
这是一个示例数据框:
import pandas as pd
import numpy as np
values = np.array([
[0, 1, 2, 0, 0, 4],
[1, 0, 0, 1, 1, 0 ],
[0, 4, 0, 0, 2, 1],
[2, 0, 2, 0, 4, 0],
])
indexes= 'a','b','c','d'
columns='ab','bc','cd','de','ef','fg'
df = pd.DataFrame(index=indexes,columns=columns, data=values)
print(df)
根据这个数据框,我需要创建一系列饼图,每列一个,显示在同一张图上,其中切片尺寸是固定的(等于 100/len(indexes))和颜色切片取决于索引的值,特别是:如果为 0,则为白色,如果为 1,则为绿色,如果为 2,则为黄色,如果为 4,则为红色。
你能给我什么建议?
我发现:
df.plot(kind='pie', subplots=True, figsize=(len(columns)*2, 2))
它创建了一个系列,但我无法控制输入值...
我已经为一个列创建了一个饼图,但是我无法 link 颜色到索引值:
labels = indexes
sizes = np.linspace(100/len(labels),100/len(labels), num=len(labels))
fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels)
ax1.axis('equal')
plt.show()
ImportanceOfBeingErnest 的回答帮助我为饼图赋予了想要的外观:
fig1, ax1 = plt.subplots()
labels = indexes
sizes = np.linspace(100/len(labels),100/len(labels), num=len(labels))
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" }
colors = [coldic[v] for v in values[:,0]]
ax1.pie(sizes, labels=labels, colors=colors,counterclock=False, startangle=90)
ax1.axis('equal')
plt.show()
现在颜色已 link 调整为值,并且切片的尺寸是固定的。我只需要在同一图像中为所有列设置相同的饼图。
这些图表的重要性是由颜色决定的,而不是切片的尺寸,我希望它们始终相等。
感谢您的宝贵时间!
不依赖 pandas 内部绘图函数(当然是有限的)可以使用 matplotlib 的 pie
函数来绘制图表。
颜色可以设置为一个列表,它是根据一些映射字典从值中生成的。
import numpy as np
import matplotlib.pyplot as plt
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" }
values = np.array([
[0, 1, 2, 0, 0, 4],
[1, 0, 0, 1, 1, 0 ],
[0, 4, 0, 0, 2, 1],
[2, 0, 2, 0, 4, 0],
])
labels= ['a','b','c','d']
fig1, axes = plt.subplots(ncols=values.shape[1], )
for i in range(values.shape[1]):
colors = [coldic[v] for v in values[:,i]]
labs = [l if values[j,i] > 0 else "" for j, l in enumerate(labels)]
axes[i].pie(values[:,i], labels=labs, colors=colors)
axes[i].set_aspect("equal")
plt.show()
对于固定的楔形尺寸,您只需使用固定数组来提供给 pie
。
import numpy as np
import matplotlib.pyplot as plt
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" }
values = np.array([
[0, 1, 2, 0, 0, 4],
[1, 0, 0, 1, 1, 0 ],
[0, 4, 0, 0, 2, 1],
[2, 0, 2, 0, 4, 0],
])
labels= ['a','b','c','d']
fig1, axes = plt.subplots(ncols=values.shape[1], )
for i in range(values.shape[1]):
colors = [coldic[v] for v in values[:,i]]
axes[i].pie(np.ones(values.shape[0]), labels=labels, colors=colors,
wedgeprops=dict(linewidth=1, edgecolor="k"))
axes[i].set_aspect("equal")
axes[i].set_title("".join(list(map(str,values[:,i]))))
plt.show()
这是一个示例数据框:
import pandas as pd
import numpy as np
values = np.array([
[0, 1, 2, 0, 0, 4],
[1, 0, 0, 1, 1, 0 ],
[0, 4, 0, 0, 2, 1],
[2, 0, 2, 0, 4, 0],
])
indexes= 'a','b','c','d'
columns='ab','bc','cd','de','ef','fg'
df = pd.DataFrame(index=indexes,columns=columns, data=values)
print(df)
根据这个数据框,我需要创建一系列饼图,每列一个,显示在同一张图上,其中切片尺寸是固定的(等于 100/len(indexes))和颜色切片取决于索引的值,特别是:如果为 0,则为白色,如果为 1,则为绿色,如果为 2,则为黄色,如果为 4,则为红色。
你能给我什么建议?
我发现:
df.plot(kind='pie', subplots=True, figsize=(len(columns)*2, 2))
它创建了一个系列,但我无法控制输入值...
我已经为一个列创建了一个饼图,但是我无法 link 颜色到索引值:
labels = indexes
sizes = np.linspace(100/len(labels),100/len(labels), num=len(labels))
fig1, ax1 = plt.subplots()
ax1.pie(sizes, labels=labels)
ax1.axis('equal')
plt.show()
ImportanceOfBeingErnest 的回答帮助我为饼图赋予了想要的外观:
fig1, ax1 = plt.subplots()
labels = indexes
sizes = np.linspace(100/len(labels),100/len(labels), num=len(labels))
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" }
colors = [coldic[v] for v in values[:,0]]
ax1.pie(sizes, labels=labels, colors=colors,counterclock=False, startangle=90)
ax1.axis('equal')
plt.show()
现在颜色已 link 调整为值,并且切片的尺寸是固定的。我只需要在同一图像中为所有列设置相同的饼图。
这些图表的重要性是由颜色决定的,而不是切片的尺寸,我希望它们始终相等。
感谢您的宝贵时间!
不依赖 pandas 内部绘图函数(当然是有限的)可以使用 matplotlib 的 pie
函数来绘制图表。
颜色可以设置为一个列表,它是根据一些映射字典从值中生成的。
import numpy as np
import matplotlib.pyplot as plt
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" }
values = np.array([
[0, 1, 2, 0, 0, 4],
[1, 0, 0, 1, 1, 0 ],
[0, 4, 0, 0, 2, 1],
[2, 0, 2, 0, 4, 0],
])
labels= ['a','b','c','d']
fig1, axes = plt.subplots(ncols=values.shape[1], )
for i in range(values.shape[1]):
colors = [coldic[v] for v in values[:,i]]
labs = [l if values[j,i] > 0 else "" for j, l in enumerate(labels)]
axes[i].pie(values[:,i], labels=labs, colors=colors)
axes[i].set_aspect("equal")
plt.show()
对于固定的楔形尺寸,您只需使用固定数组来提供给 pie
。
import numpy as np
import matplotlib.pyplot as plt
coldic = {0 : "w", 1 : "g", 2 : "y", 4 : "r" }
values = np.array([
[0, 1, 2, 0, 0, 4],
[1, 0, 0, 1, 1, 0 ],
[0, 4, 0, 0, 2, 1],
[2, 0, 2, 0, 4, 0],
])
labels= ['a','b','c','d']
fig1, axes = plt.subplots(ncols=values.shape[1], )
for i in range(values.shape[1]):
colors = [coldic[v] for v in values[:,i]]
axes[i].pie(np.ones(values.shape[0]), labels=labels, colors=colors,
wedgeprops=dict(linewidth=1, edgecolor="k"))
axes[i].set_aspect("equal")
axes[i].set_title("".join(list(map(str,values[:,i]))))
plt.show()