【发布时间】:2019-02-07 14:27:44
【问题描述】:
如何获得不同的饼图颜色?我有一个大约 20 个类别的数据集,它可能会更大。当我创建一个饼图时,一些楔形具有相同的颜色,所以我想知道有没有一种方法可以让我的饼图的楔形中的所有颜色都不同? 谢谢!
【问题讨论】:
-
this 会回答您的问题吗?请查看
color=[colorlist]选项。
标签: python matplotlib
如何获得不同的饼图颜色?我有一个大约 20 个类别的数据集,它可能会更大。当我创建一个饼图时,一些楔形具有相同的颜色,所以我想知道有没有一种方法可以让我的饼图的楔形中的所有颜色都不同? 谢谢!
【问题讨论】:
color=[colorlist] 选项。
标签: python matplotlib
20 种颜色正是您可以通过 matplotlib 中的分类/定性颜色图实现的极限。目前 matplotlib 提供了tab20、tab20b、tab20c 颜色图。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randint(50,200, size=20)
fig = plt.figure()
with plt.style.context({"axes.prop_cycle" : plt.cycler("color", plt.cm.tab20.colors)}):
ax = fig.add_subplot(121, aspect="equal")
ax.pie(data)
with plt.style.context({"axes.prop_cycle" : plt.cycler("color", plt.cm.tab20c.colors)}):
ax2 = fig.add_subplot(122, aspect="equal")
ax2.pie(data)
plt.show()
对于更多颜色,当然也可以使用different colormaps,但这些通常会导致彼此相邻的颜色非常相似。例如。对于具有 30 种不同颜色的饼图,我们可以使用 nipy_spectral 或 CMRmap 颜色图。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randint(50,200, size=30)
fig = plt.figure()
cc = plt.cycler("color", plt.cm.nipy_spectral(np.linspace(0,.9,len(data))))
with plt.style.context({"axes.prop_cycle" : cc}):
ax = fig.add_subplot(121, aspect="equal")
ax.pie(data)
cc = plt.cycler("color", plt.cm.CMRmap(np.linspace(0,0.9,len(data))))
with plt.style.context({"axes.prop_cycle" : cc}):
ax2 = fig.add_subplot(122, aspect="equal")
ax2.pie(data)
plt.show()
因此可以添加另一个维度。从任何颜色图中选择一些颜色并为每个颜色创建不同的亮度级别。这基本上显示在this answer 中。在这里,为了得到例如30 种不同的颜色,我们可以选择 6 种颜色,每 5 个亮度级别。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors
def categorical_cmap(nc, nsc, cmap="tab10", continuous=False):
if nc > plt.get_cmap(cmap).N:
raise ValueError("Too many categories for colormap.")
if continuous:
ccolors = plt.get_cmap(cmap)(np.linspace(0,1,nc))
else:
ccolors = plt.get_cmap(cmap)(np.arange(nc, dtype=int))
cols = np.zeros((nc*nsc, 3))
for i, c in enumerate(ccolors):
chsv = matplotlib.colors.rgb_to_hsv(c[:3])
arhsv = np.tile(chsv,nsc).reshape(nsc,3)
arhsv[:,1] = np.linspace(chsv[1],0.25,nsc)
arhsv[:,2] = np.linspace(chsv[2],1,nsc)
rgb = matplotlib.colors.hsv_to_rgb(arhsv)
cols[i*nsc:(i+1)*nsc,:] = rgb
cmap = matplotlib.colors.ListedColormap(cols)
return cmap
data = np.random.randint(50,200, size=30)
fig = plt.figure()
cc = plt.cycler("color", categorical_cmap(6, 5, cmap="tab10").colors)
with plt.style.context({"axes.prop_cycle" : cc}):
ax = fig.add_subplot(121, aspect="equal")
ax.pie(data)
cc = plt.cycler("color",
categorical_cmap(6, 5, cmap="gist_rainbow", continuous=True).colors)
with plt.style.context({"axes.prop_cycle" : cc}):
ax2 = fig.add_subplot(122, aspect="equal")
ax2.pie(data)
plt.show()
【讨论】: