

pythonのmatplotlibを使用して,横棒グラフの塗りつぶしの柄を変えたいです．  
現在，赤色と青色で判別できますが，モノクロにした際に判別できるようにしたいです．  
具体的には破線や斜線，格子や水玉などの柄に変えて判別したいです．  
何か方法はありませんか．よろしくお願いします。

data.txt

[code]

    0   0    0.016   19.833
    1   0   19.834   52.805
    2   0   52.806   84.005
    5   0   84.012  107.305
    8   0  107.315  128.998
    10  0  129.005  138.956
    11  0  138.961  145.587
    25  1   31.096   56.180
    27  1   58.097   64.857
    28  1   64.858   66.494
    29  1   66.496   89.908
    
[/code]

プログラムは以下のとおりです。

[code]

    #! /usr/bin/env python
    # -*- coding: shift_jis -*-
    import numpy as np
    import matplotlib.pyplot as plt
    y, c, x1, x2 = np.loadtxt('data.txt', unpack=True)
    color_mapper = np.vectorize(lambda x: {0: 'red', 1: 'blue'}.get(x))
    
    plt.hlines(y, x1, x2, colors=color_mapper(c),lw=10)
    plt.margins(0.1)
    
    plt.grid()
    plt.show()
    
[/code]


CC BY-SA 3.0
2016-02-09T07:28:58.207
21893
2016-02-10T07:15:25.463
14248
question
python matplotlib
pythonのmatplotlibを使用して,横棒グラフの塗りつぶしの柄を変えたい


`hlines()` (`Line2D` オブジェクト) だと、あくまでも線を引くだけなので、`dashed` とか `dotted` といった程度しか
[`linestyles`](http://matplotlib.org/api/pyplot_api.html) に設定できません。

<http://matthiaseisen.com/pp/patterns/p0203/> にあるように、各々の矩形を描画していく必要があるでしょう。

[code]

    #! /usr/bin/env python
    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    
    STYLES = [
      dict(fill=False, hatch='/', color='red'),
      dict(fill=True, hatch='\\', color='blue', alpha=0.5),
    ]
    HEIGHT = 1
    
    _, ax = plt.subplots()
    
    with open('data.txt') as f:
      for line in f.readlines():
        y, c, x1, x2 = line.split()
        y = float(y) - HEIGHT / 2
        x1 = float(x1)
        width = float(x2) - x1
        c = int(c)
        ax.add_patch(patches.Rectangle((x1, y), width, HEIGHT, **(STYLES[c])))
    
    plt.margins(0.1)
    plt.grid()
    plt.show()
    
[/code]

numpy 使ったことないので、ファイル読み込み部分は素の Python コードです。必要に応じて適宜読み替えてください。

`STYLES` は `Rectangle()` へのキーワード引数をまとめたものです。


CC BY-SA 3.0
2016-02-10T07:15:25.463
21935
2016-02-10T07:15:25.463
2521
21893
answer