首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取matplotlib颜色周期状态

获取matplotlib颜色周期状态
EN

Stack Overflow用户
提问于 2012-12-12 09:50:07
回答 7查看 52.2K关注 0票数 95

可以查询matplotlib颜色周期的当前状态吗?换句话说,有没有一个函数get_cycle_state的行为方式如下?

>>> plot(x1, y1)
>>> plot(x2, y2)
>>> state = get_cycle_state()
>>> print state
2

其中我期望状态是将在绘图中使用的下一种颜色的索引。或者,如果它返回下一个颜色(在上面的示例中,默认循环为“r”),也可以。

EN

回答 7

Stack Overflow用户

发布于 2016-07-23 14:47:35

这里有一种在1.5中工作的方法,希望它能适应未来,因为它不依赖于带有下划线的方法:

colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]

这将为您提供一个为当前样式定义的颜色列表。

票数 30
EN

Stack Overflow用户

发布于 2015-11-09 19:56:30

注意:在matplotlib (>= 1.5)的最新版本中,_get_lines发生了变化。现在需要使用Python2或3中的next(ax._get_lines.prop_cycler)['color'] (或Python 2中的ax._get_lines.prop_cycler.next()['color'] )从颜色循环中获取下一种颜色。

只要有可能,请使用@joe-kington答案下半部分所示的更直接的方法。由于_get_lines不是面向应用程序接口的,因此将来可能会以不向后兼容的方式再次更改。

票数 18
EN

Stack Overflow用户

发布于 2012-12-12 10:20:39

当然,这样就可以了。

#rainbow

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,2*np.pi)
ax= plt.subplot(1,1,1)
ax.plot(np.sin(x))
ax.plot(np.cos(x))

rainbow = ax._get_lines.color_cycle
print rainbow
for i, color in enumerate(rainbow):
    if i<10:
        print color,

提供:

<itertools.cycle object at 0x034CB288>
r c m y k b g r c m

下面是matplotlib使用itertools.cycle的itertools函数

编辑:谢谢你的评论,似乎不可能复制迭代器。一个想法是转储一个完整的周期,并跟踪您正在使用的值,让我回到这一点上来。

Edit2:好吧,这将给你下一个颜色,并生成一个新的迭代器,它的行为就像没有调用next一样。这不会保持颜色的顺序,只保留下一个颜色值,我把它留给你。

这给出了下面的输出,注意图中的陡度对应于索引,例如第一个g是最底层的图形,依此类推。

#rainbow

import matplotlib.pyplot as plt
import numpy as np
import collections
import itertools

x = np.linspace(0,2*np.pi)
ax= plt.subplot(1,1,1)


def create_rainbow():
    rainbow = [ax._get_lines.color_cycle.next()]
    while True:
        nextval = ax._get_lines.color_cycle.next()
        if nextval not in rainbow:
            rainbow.append(nextval)
        else:
            return rainbow

def next_color(axis_handle=ax):
    rainbow = create_rainbow()
    double_rainbow = collections.deque(rainbow)
    nextval = ax._get_lines.color_cycle.next()
    double_rainbow.rotate(-1)
    return nextval, itertools.cycle(double_rainbow)


for i in range(1,10):
    nextval, ax._get_lines.color_cycle = next_color(ax)
    print "Next color is: ", nextval
    ax.plot(i*(x))


plt.savefig("SO_rotate_color.png")
plt.show()

控制台

Next color is:  g
Next color is:  c
Next color is:  y
Next color is:  b
Next color is:  r
Next color is:  m
Next color is:  k
Next color is:  g
Next color is:  c

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13831549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档