使用matplotlib的色彩循环作为色彩映射

时间:2016-04-22 19:17:05

标签: python matplotlib

可以设置颜色循环以匹配现有的颜色映射,但是这个问题是询问如何进行反转:从颜色循环中创建定性颜色映射。

在我的具体情况中,我得到了一个散点图,其中包含一个相关的整数类标签数组。我目前的情节如下:

x,y = np.random.normal(size=(2,250))
theta = np.arctan2(y,x)
c = np.digitize(theta, np.histogram(theta)[1])
plt.scatter(x,y,c=c)

current scatter plot

正如您所看到的,这并不能很好地区分课程。相反,我想以某种方式插入与当前颜色周期匹配的色彩映射,其中标签i对应于color_cycle[i]。如果我有更多的课程而不是颜色循环有颜色,那很好,它应该像往常一样环绕。

1 个答案:

答案 0 :(得分:1)

我认为没有用于获取当前颜色周期的公共API,但通过模仿set_prop_cycle,您可以通过这种方式定义get_prop_cycle

rcParams = plt.matplotlib.rcParams
def get_prop_cycle():
    prop_cycler = rcParams['axes.prop_cycle']
    if prop_cycler is None and 'axes.color_cycle' in rcParams:
        clist = rcParams['axes.color_cycle']
        prop_cycler = cycler('color', clist)
    return prop_cycler

获得prop_cycler中的颜色后,您可以将c映射到颜色周期中的颜色:

colors = [item['color'] for item in get_prop_cycle()]
c = np.take(colors, c, mode='wrap')
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.rcsetup import cycler

np.random.seed(2016)

rcParams = plt.matplotlib.rcParams
def get_prop_cycle():
    prop_cycler = rcParams['axes.prop_cycle']
    if prop_cycler is None and 'axes.color_cycle' in rcParams:
        clist = rcParams['axes.color_cycle']
        prop_cycler = cycler('color', clist)
    return prop_cycler

fig, ax = plt.subplots(nrows=2)
x,y = np.random.normal(size=(2,250))
theta = np.arctan2(y,x)
c = np.digitize(theta, np.histogram(theta)[1])

ax[0].scatter(x,y,c=c)
ax[0].set_title('using default colormap')

colors = [item['color'] for item in get_prop_cycle()]
c = np.take(colors, c, mode='wrap')

ax[1].scatter(x,y,c=c)
ax[1].set_title('using color cycle')
plt.show()

enter image description here