2017-02-20 8 views
0

私はPythonを使い始めています。次のコードを使ってファセットグリッドにパッチを追加しています。 AttributeError: 'FacetGrid'オブジェクトに 'add_patch'属性がありません。私はいくつかの広範な研究を行ったが、この問題に対する解決策を見つけることはできない。facetgridのパッチ - Python

import pandas as pd 

import matplotlib.pyplot as plt 
import seaborn as sns 
from matplotlib.patches import Circle, Rectangle, Arc 
sns.set_style("white") 
sns.set_color_codes() 

def draw_pitch(ax=None, color='black', lw=2, outer_lines=True): 
# If an axes object isn't provided to plot onto, just get current one 
if ax is None: 
    ax = plt.gca() 

私はこのplt.gcaの問題(があるかもしれないと思う)が、私はそれを置き換えるべきかかどうかを知りませんか?

# Create goal 
goal = Rectangle((-15,0), 30, .5, linewidth=3, color=color) 

# The box 
box = Rectangle((-81, 0), 162, 66, linewidth=lw, color=color, 
         fill=False) 

#6ybox 
ybox = Rectangle((-37, 0), 74, 22, linewidth=lw, color=color, fill=False) 

#Penaltyarc 
Parc = Arc((0,44),73.4,73.4, theta1=37, theta2=143,linewidth=lw, color=color, fill=False) 
#Penalty 

PSpot = Circle((0,44),radius=.5, linewidth=lw, color=color, fill=False) 
# List of the court elements to be plotted onto the axes 
pitch_elements = [goal, box, ybox, PSpot,Parc] 

if outer_lines: 
    # Draw the half court line, baseline and side out bound lines 
    outer_lines = Rectangle((-136, 0), 272, 210, linewidth=lw, 
          color=color, fill=False) 
    pitch_elements.append(outer_lines) 

# Add the court elements onto the axes 
for element in pitch_elements: 

    ax.add_patch(element) 

return ax 
plt.figure(figsize=(12,11)) 
draw_pitch(outer_lines=True) 
plt.xlim(-136,136) 
plt.ylim(0,210) 

cmap = 'jet' 
file = 'Chances23clean.csv' 
df = pd.read_csv(file) 
df.teamf=df.teamf.apply(str) 

g = sns.FacetGrid(df, col="teamf", col_wrap=4,size=3.5,ylim=(210,0),xlim=(136,-136)) 

g = (g.map(sns.kdeplot,"primaryLocation_x", "primaryLocation_y", shade=True,cmap=cmap,n_levels=40).set_titles("{col_name}",fontsize=300).set_axis_labels("","").set_ylabels('').set_xticklabels('','').set_yticklabels('')) 

draw_pitch(g) 

[OK]をクリックして、次のように進捗状況を確認しました。代わりに、上記のコードになるの:

draw_pitch(g) 

私は

draw_pitch(g.axes[0]) 
draw_pitch(g.axes[1]) 
draw_pitch(g.axes[2]) 
... 
draw_pitch(g.axes[19]) 

ことによってそれに取って代わったそして、それは動作しますが、ここでは、コードを簡素化する方法はありますか?どうもありがとう。

+0

問題の[mcve]を提供することで、プロセスを大幅に促進できます。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnestご覧のとおり、私はコーディングとstackoverflowの初心者です。私は自分の質問を改善することができて嬉しいですが、読みやすくするためにどこから始めるべきかはっきりしていませんか?あなたの助けをもう一度ありがとう。 – MattnDo

+0

ここでの主な問題は、問題が再現できないことです。つまり、問題を特定して解決するために、コードをコピーしてマシン上で実行することはできません。したがって、[mcve]を作成することが重要です。そのような最小限の例では、問題が使用中の特定のファイルに直接関連していない限り、読み込むためにファイルを使用すべきではなく、汎用のDataFrameを使用してください。また、コード内のすべてのオブジェクトを定義する必要があります。あなたのコードの 'pitch_elements'は定義されていません。 – ImportanceOfBeingErnest

答えて

0

draw_pitch(g)draw_pitch(g.axes[0, 0])で置き換えてみてください。ファセットグリッドは軸を2次元の配列に格納しますが、ファセットグリッドに軸が1つしかない場合は、g.axと記述する必要があります。

+0

'draw_pitch(g.axes [0、0])'で試してみましたが、 'IndexError:配列のインデックスが多すぎます.' 'draw_pitch(g.ax)'で試したところ、 'AttributeError'を取得しました – MattnDo

+0

@Mattnは' print g.axes.shape'の結果を報告できますか? 'g.axes [0]'は別のエラーを出しますか? – ImportanceOfBeingErnest

+0

あなたの答えをありがとう! 'print(g.axes.shape)'は何も報告しません、 'g.axes [0]'はエラーを出すのではなく、ファセットグリッドの最初の左上のファセットだけを描画します。 – MattnDo

関連する問題