Python Matplotlib:在plot_date中更改颜色

时间:2016-11-01 13:23:01

标签: python matplotlib

我想绘制一个数据,其中包含x axis的日期时间值和另一组值y。例如,我将使用matplotlib中的example,其中y在这种情况下是股票价格。这是代码。

import matplotlib.pyplot as plt
from matplotlib.finance import quotes_historical_yahoo_ochl
from matplotlib.dates import YearLocator, MonthLocator, DateFormatter
import datetime
date1 = datetime.date(1995, 1, 1)
date2 = datetime.date(2004, 4, 12)

years = YearLocator()   # every year
months = MonthLocator()  # every month
yearsFmt = DateFormatter('%Y')

quotes = quotes_historical_yahoo_ochl('INTC', date1, date2)
if len(quotes) == 0:
    raise SystemExit

dates = [q[0] for q in quotes]
opens = [q[1] for q in quotes]

fig, ax = plt.subplots()
ax.plot_date(dates, opens, '-')

# format the ticks
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(yearsFmt)
ax.xaxis.set_minor_locator(months)
ax.autoscale_view()

# format the coords message box
def price(x):
   return '$%1.2f' % x
ax.fmt_xdata = DateFormatter('%Y-%m-%d')
ax.fmt_ydata = price
ax.grid(True)

fig.autofmt_xdate()
plt.show()

现在,我想要做的是根据某些标准为图表中的每个值着色。为简单起见,我们假设示例中的标准基于年份。也就是说,属于同一年的价格将是相同的。我该怎么办?谢谢!

2 个答案:

答案 0 :(得分:2)

我通常这样做的方法是使用for循环绘制数据的不同部分,随着每个部分着色。在您的示例中,此部分:

fig, ax = plt.subplots()
ax.plot_date(dates, opens, '-')

变为:

# import the colormaps
from maplotlib import cm

fig, ax = plt.subplots()

for y in years:
    y_indices = [i for i in range(len(dates)) if dates[i].year==y]

    # subset the data, there are better ways to do this
    sub_dates = [dates[i] for i in y_indices]
    sub_opens = [opens[i] for i in y_indices]

    # plot each section of data, using a colormap to change the color for
    # each iteration.
    ax.plot_date(sub_dates, sub_opens, '-', linecolor=cm.spring((y-2000)/10.0)

答案 1 :(得分:2)

你可以在你想要的范围内使用带有蒙版的numpy数组(在这种情况下是一年)。为了使用示例中的内置YearLocator函数,您需要首先绘制图形并设置刻度,然后从示例中删除并替换每年的范围

import matplotlib.pyplot as plt
from matplotlib.finance import quotes_historical_yahoo_ochl
from matplotlib.dates import YearLocator, MonthLocator, DateFormatter
import datetime
import numpy 

date1 = datetime.date(1995, 1, 1)
date2 = datetime.date(2004, 4, 12)

years = YearLocator()   # every year
months = MonthLocator()  # every month
yearsFmt = DateFormatter('%Y')

quotes = quotes_historical_yahoo_ochl('INTC', date1, date2)
if len(quotes) == 0:
    raise SystemExit

dates = np.array([q[0] for q in quotes])
opens = np.array([q[1] for q in quotes])

fig, ax = plt.subplots()
l = ax.plot_date(dates, opens, '-')

# format the ticks
ax.xaxis.set_major_locator(years)
ax.xaxis.set_major_formatter(yearsFmt)
ax.xaxis.set_minor_locator(months)
ax.autoscale_view()

l[0].remove()
py = years()[0]
for year in years()[1:]:
    mask = (py < dates) & (dates < year)
    ax.plot_date(dates[mask], opens[mask], '-')
    py = year

# format the coords message box
def price(x):
   return '$%1.2f' % x
ax.fmt_xdata = DateFormatter('%Y-%m-%d')
ax.fmt_ydata = price
ax.grid(True)

fig.autofmt_xdate()
plt.show()

给出,

enter image description here