我目前正在尝试使用matplotlibs plot_date
函数绘制多个日期图。我无法弄清楚的一件事是如何自动为每个图表分配不同的颜色(与plot
中设置axes.color_cycle
后matplotlib.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
一样容易?
答案 0 :(得分:5)
从this discussion in GitHub
开始,这是解决此问题的好方法:
ax.plot_date(d, nv, ls='solid', fmt='')
正如@tcaswell解释的那样,默认情况下此函数设置为fmt='bo'
,用户可以在调用fmt
时传递参数plot_date()
来覆盖此函数。
这样做,结果将是:
答案 1 :(得分:0)
尽管你发现了可能的错误,但你可以解决这个问题并创建如下的情节:
代码如下。基本上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_plot
和axes.date_plot
都有默认参数,将格式设置为bo
。
请参阅https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/axes.py#L4145和https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/pyplot.py#L2997
[在github上留下相同的评论]
plot_date
对plot
的唯一作用是轴格式化程序的一些配置,您可以手动完成。
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()