在Python中基于条件绘制多彩时间序列图

时间:2018-01-23 02:01:18

标签: python pandas matplotlib plot time-series

我有一个pandas Financial timeseries DataFrame,有两列和一个日期时间索引。

   class MainLandingPage_au extends Page
   {

    private static $has_many = [
       'ImagesWithHtml' => ImageWithHtml::class,
       'ImagesWithHtml2' => ImageWithHtml::class,
    ];

    // ...
    $fields->addFieldToTab('Root.Section1', HtmlEditorField::create('Section1Title','Section 1 Title')->setRows(4));
    $fields->addFieldToTab('Root.Section1', GridField::create(
        'ImagesWithHtml',
        'Images With Html For This Page',
        $this->ImagesWithHtml(),
        GridFieldConfig_RecordEditor::create()
    ));

    $fields->addFieldToTab('Root.Section2', HtmlEditorField::create('Section2Title','Section 2 Title')->setRows(4));
    $fields->addFieldToTab('Root.Section2', GridField::create(
        'ImagesWithHtml2',
        'Images With Html For Section 2',
        $this->ImagesWithHtml2(),
        GridFieldConfig_RecordEditor::create()
    ));

正如您所看到的,每个数据集都对应一个'标签'。这个标签应该基本上分类是否来自前一个点的线路'到下一个点#39;具有某些特征(不同类型的股票图表变化),因此对每个图表使用单独的颜色。此问题与此问题Plot Multicolored line based on conditional in python相关,但' groupby'部分完全跳过我的理解,这个方案是Bicolored计划而不是多彩的(我有四个标签)。

我想根据与数据框中每个条目相关联的标签创建图表的多色图。

1 个答案:

答案 0 :(得分:0)

以下是我认为您尝试做的事情的一个例子。它基于评论中提到的MPL文档,并使用随机生成的数据。 只需将色彩映射边界映射到由类数给出的离散值。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm
import pandas as pd


num_classes = 4
ts = range(10)
df = pd.DataFrame(data={'TOTAL': np.random.rand(len(ts)), 'Label': np.random.randint(0, num_classes, len(ts))}, index=ts)
print(df)

cmap = ListedColormap(['r', 'g', 'b', 'y'])
norm = BoundaryNorm(range(num_classes+1), cmap.N)
points = np.array([df.index, df['TOTAL']]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(df['Label'])

fig1 = plt.figure()
plt.gca().add_collection(lc)
plt.xlim(df.index.min(), df.index.max())
plt.ylim(-1.1, 1.1)
plt.show()

每个线段都根据df['Label']中给出的类别标签着色。这里是一个示例结果:

enter image description here