2017-02-20 17 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) 

ОК, поэтому я сделал хороший прогресс, выполнив следующее. Вместо того, чтобы на приведенном выше коде:

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]). Facetgrid хранит оси в массиве 2d numpy, но если facetgrid имеет только одну ось, вы должны написать 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