Seaborn sns.FacetGrid ValueError: аргумент экземпляра Axes не найден в фигуре - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь визуализировать t-SNE набора данных MIST с помощью поисковой фасетной сетки, но получаю ошибку при построении. Ниже код и ошибка

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
import seaborn as sns 
from sklearn import datasets
from sklearn import manifold
%matplotlib inline
data = datasets.fetch_openml('mnist_784',
version=1,
return_X_y=True
)
pixel_values, targets = data
targets = targets.astype(int)
single_image =  pixel_values[1, :].reshape(28,28)
plt.imshow(single_image, cmap='gray')
tsne = manifold.TSNE(n_components=2, random_state=42)
transformed_data = tsne.fit_transform(pixel_values[:3000, :])
tsne_df = pd.DataFrame(np.column_stack((transformed_data, targets[:3000])), columns=["x", "y", "targets"])
tsne_df.loc[:,"targets"] = tsne_df.targets.astype(int)
grid = sns.FacetGrid(tsne_df, hue="targets", height=8)
grid.map(plt.scatter, "x", "y").add_legend()

Однако при запуске grid.map (plt.scatter, «x», «y») появляется следующая ошибка. Add_legend ()

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-84d161de948f> in <module>
----> 1 grid.map(plt.scatter, "x", "y").add_legend()

~/opt/miniconda3/envs/ml/lib/python3.7/site-packages/seaborn/axisgrid.py in map(self, func, *args, **kwargs)
    736 
    737             # Get the current axis
--> 738             ax = self.facet_axis(row_i, col_j)
    739 
    740             # Decide what color to plot with

~/opt/miniconda3/envs/ml/lib/python3.7/site-packages/seaborn/axisgrid.py in facet_axis(self, row_i, col_j)
    866 
    867         # Get a reference to the axes object we want, and make it active
--> 868         plt.sca(ax)
    869         return ax
    870 

~/opt/miniconda3/envs/ml/lib/python3.7/site-packages/matplotlib/pyplot.py in sca(ax)
    856             m.canvas.figure.sca(ax)
    857             return
--> 858     raise ValueError("Axes instance argument was not found in a figure")
    859 
    860 

ValueError: Axes instance argument was not found in a figure

Ответы [ 2 ]

1 голос
/ 15 июля 2020

Я не знаю, чего вы пытаетесь достичь с помощью FacetGrid.

Если вы хотите построить tSNE, вам нужно просто сделать:

fig, ax = plt.subplots()
s = ax.scatter(tsne_df['x'], tsne_df['y'], c=tsne_df['targets'], cmap='tab10', ec='w')
ax.legend(*s.legend_elements(), title="Targets")

enter image description here

A FacetGrid allows you to split that graph according to a categorical data (not a numeric data like you were trying to do). Therefore, you can do a different scatterplot for each of the target number if you wanted:

g = sns.FacetGrid(data=tsne_df, col='targets', col_wrap=3, hue='targets')
g.map(plt.scatter, 'x', 'y', ec='w')

введите описание изображения здесь

0 голосов
/ 15 июля 2020

Одно странное наблюдение: мне удалось отобразить график, когда я выполнил обе строки в одной строке.

Если я выполняю в отдельных строках, это не работает. Есть какая-нибудь конкретная c причина этого? введите описание изображения здесь

...