使用`plot_date()`在日期图上使用颜色循环设置颜色

时间:2013-06-22 11:48:20

标签: python matplotlib

我目前正在尝试使用matplotlibs plot_date函数绘制多个日期图。我无法弄清楚的一件事是如何自动为每个图表分配不同的颜色(与plot中设置axes.color_cyclematplotlib.rcParams时的情况一样。示例代码:

import datetime as dt
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

values = xrange(1, 13)
dates = [dt.datetime(2013, i, 1, i, 0, 0, 0) for i in values]
mpl.rcParams['axes.color_cycle'] = ['r', 'g']
for i in (0, 1, 2):
    nv = map(lambda k: k+i, values)
    d = mdates.date2num(dates)
    plt.plot_date(d, nv, ls="solid")
plt.show()

这给了我一个很好的数字,其中有3行,但它们都有相同的颜色。将对plot_date的调用更改为仅plot会产生红色和绿色的3行,但遗憾的是x轴上的标签不再有用。

所以我的问题是,有没有办法让着色与plot_date一起使用,就像只对plot一样容易?

3 个答案:

答案 0 :(得分:5)

this discussion in GitHub开始,这是解决此问题的好方法:

ax.plot_date(d, nv, ls='solid', fmt='')

正如@tcaswell解释的那样,默认情况下此函数设置为fmt='bo',用户可以在调用fmt时传递参数plot_date()来覆盖此函数。

这样做,结果将是:

enter image description here

答案 1 :(得分:0)

尽管你发现了可能的错误,但你可以解决这个问题并创建如下的情节:

enter image description here

代码如下。基本上plot()之后添加了plot_date()

values = xrange(1, 13)
dates = [dt.datetime(2013, i, 1, i, 0, 0, 0) for i in values]
mpl.rcParams['axes.color_cycle'] = ['r', 'g', 'r']
ax = plt.subplot(111)
for i in (0, 1, 2):
    nv = map(lambda k: k+i, values)
    d = mdates.date2num(dates)
    ax.plot_date(d, nv, ls='solid')
    ax.plot(d, nv, '-o')
plt.gcf().tight_layout()
plt.show()

请注意,还需要另一个'r',因为尽管没有显示,但颜色确实在plot_date()中循环,如果没有这样,则线条将为绿 - 红 - 绿。

答案 2 :(得分:0)

这不是错误,而是设计选择。 plt.date_plotaxes.date_plot都有默认参数,将格式设置为bo

请参阅https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/axes.py#L4145https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/pyplot.py#L2997

[在github上留下相同的评论]

plot_dateplot的唯一作用是轴格式化程序的一些配置,您可以手动完成。

import datetime as dt
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


values = xrange(1, 13)
dates = [dt.datetime(2013, i, 1, i, 0, 0, 0) for i in values]
mpl.rcParams['axes.color_cycle'] = ['r', 'g', 'r']
ax = plt.subplot(111)
for i in (0, 1, 2):
    nv = map(lambda k: k+i, values)
    d = mdates.date2num(dates)

    ax.plot(d, nv, '-o')

ax.xaxis_date()
plt.gcf().tight_layout()
plt.show()