2017-11-03 7 views
0

私はプロットのために主にパイソンを学ぼうとしています。ここに私のサンプルコードです:matplotlibを使ってバーのグループを整形する

import numpy as np 
import matplotlib.pyplot as plt 


a=[[1,2,3,4],[2,3,4,5],[3,4,5,6]] 
x=np.arange(len(a[0])) 
width=0.2 

fig, ax = plt.subplots(figsize=(8,6)) 
patterns=['/','\\','*'] 

for bar in a: 
    ax.bar(x,bar,width,edgecolor='black',color='lightgray', hatch=patterns.pop(0)) 
    x=x+width 

plt.show() 

今の問題は、私はすべてのバーのエッジの色だけでなく、与えられたハッチパタパタを必要とする、ということです。ただし、書式設定は最初のバーのみに適用されます。ここに私の出力です。 (私はpython3を使用しています)。

enter image description here

ここで何が欠けているか間違って何ですか?私は周りを見回しましたが、修正が見つかりませんでした。

更新: 私はさまざまなオプションを試しました:python2、python3、pdf/png。 python2のPDF

  • 上に示した - - this
  • のpython3のPDFファイルを参照してください - 私も持っているthis
  • を参照してくださいここでの結果

    • python2 PNG --fine
    • のpython3 PNGです「バックエンド」をmatplotlib.use('Agg')として試しました。私はmatplotlibバージョン(2.1.0)を更新しました。

    答えて

    2

    edgecolorタプルのアルファ値に問題があります。 1に設定すると問題が解決されます。

    +0

    右が、私はバーのちょうど3つのタイプ、すなわち最初のバーがある - 前方をスラッシュ、2番目のバー - バックスラッシュ、最後に開始します。ポップの代わりに、パターン[i]を実行すると同じ結果が返されます。 – novice

    +0

    各バーの境界線はどうですか? – novice

    +0

    編集すると、itertoolsパッケージでより良い解決策があるかもしれません。 –

    2

    matplotlib 2.1には、最初のバーのedgecolorのみが適用されるcurrent issueがあります。ハッチの場合も同様です。this issueを参照してください。また、this questionを参照してください。

    python3ではmatplotlib 2.1を使用していますが、python2では使用していない可能性があります。したがって、python2ではmatropotlib 2.1が動作します。 matplotlib 2.1でPython 2でコードを実行すると、同じ望ましくない動作が発生します。

    matplotlib 2.1.1がリリースされると、問題は解決されます。一方

    、回避策は、個々のバーの上にEdgeColorとハッチを設定することです:

    import numpy as np 
    import matplotlib.pyplot as plt 
    
    
    a=[[1,2,3,4],[2,3,4,5],[3,4,5,6]] 
    x=np.arange(len(a[0])) 
    width=0.2 
    
    fig, ax = plt.subplots(figsize=(8,6)) 
    patterns=['/','\\','*'] 
    
    for y in a: 
        bars = ax.bar(x,y,width,color='lightgray') 
        hatch= patterns.pop(0) 
        for bar in bars: 
         bar.set_edgecolor("black") 
         bar.set_hatch(hatch) 
        x=x+width 
    
    plt.show() 
    

    enter image description here

    関連する問題