17

I am getting a bizarre exception in Seaborn.

For a reproducible example:

toy_data.to_json()
'{"X":{"0":0.12765045,"1":0.0244816152,"2":0.1263715245,"3":0.0246376768,"4":0.1108581319,"5":0.1406719382,"6":0.1358105564,"7":0.1245863432,"8":0.1175445352,"9":0.1188479018,"10":0.1113148159,"11":0.117455495,"12":0.110555662,"13":0.1328567106,"14":0.103064284,"15":0.1119474442,"16":0.119390455,"17":0.1246727756,"18":0.1117827155,"19":0.1169972547},"Y":{"0":0.1241083714,"1":0.1394242378,"2":0.1225010796,"3":0.0077080173,"4":0.1198371354,"5":0.0029026989,"6":0.1259473297,"7":0.0,"8":0.0,"9":0.1214620231,"10":0.1204110739,"11":0.0,"12":0.1194570059,"13":0.0014971676,"14":0.1184584731,"15":0.1212061305,"16":0.1221438778,"17":0.0,"18":0.1209991075,"19":0.0},"Label":{"0":"17","1":"3","2":"17","3":"0","4":"14","5":"21","6":"16","7":"23","8":"20","9":"15","10":"14","11":"20","12":"14","13":"22","14":"13","15":"14","16":"15","17":"23","18":"14","19":"20"},"Probability":{"0":1.0,"1":1.0,"2":1.0,"3":1.0,"4":1.0,"5":1.0,"6":1.0,"7":1.0,"8":1.0,"9":1.0,"10":1.0,"11":1.0,"12":1.0,"13":1.0,"14":1.0,"15":1.0,"16":1.0,"17":1.0,"18":0.9101796407,"19":1.0}}'

toy_data.head()
       X           Y    Label   Probability
0   0.127650    0.124108    17  1.0
1   0.024482    0.139424    3   1.0
2   0.126372    0.122501    17  1.0
3   0.024638    0.007708    0   1.0
4   0.110858    0.119837    14  1.0

sns.scatterplot(x = toy_data.X, y = toy_data.Y, hue = toy_data.Label.values, alpha = 0.5)

AttributeError: 'str' object has no attribute 'view'

Similar exception with this syntax:

sns.scatterplot(x = 'X', y = 'Y', data = toy_data, hue = 'Label', alpha = 0.5)
2
  • 1
    Check this: github.com/mwaskom/seaborn/issues/1515 Commented Jan 3, 2019 at 22:54
  • You should change your 'Label' column to numbers. That'll probably do it. Unless they truly are categorical. Commented Jan 3, 2019 at 22:54

2 Answers 2

21

This is a peculiar issue with seaborn where the color palette needs to equal the number of labels

sns.scatterplot(x = toy_data.X, y = toy_data.Y, hue = toy_data.Label, alpha = 0.5,
                palette=sns.color_palette("Set1", toy_data.Label.nunique()) )

If not, seaborn will apply numerical functions to map the number of hue categories to the default palette of four colours. This is why you get an error when the values are a string

Sign up to request clarification or add additional context in comments.

1 Comment

This should be the accepted answer IMHO, because it does not force the hue to be numeric (think truly categorical data such as zip codes). And just in case it's not clear enough: all we need to do is add the palette argument with custom number of colors.
5

As presented, your column Label is an object. It need to be a number (int or float).

toy_data.info()

<class 'pandas.core.frame.DataFrame'>
Index: 20 entries, 0 to 9
Data columns (total 4 columns):
X              20 non-null float64
Y              20 non-null float64
Label          20 non-null object
Probability    20 non-null float64
dtypes: float64(3), object(1)
memory usage: 800.0+ bytes

Do this:

toy_data.loc[:,'Label'] = toy_data.Label.astype(np.float)

to change it to float.

Then your command:

sns.scatterplot(x = toy_data.X, y = toy_data.Y, hue = toy_data.label.values, alpha = 0.5)

should work.

enter image description here

I am using this command to generate the data frame

dict = {"X":{"0":0.12765045,"1":0.0244816152,"2":0.1263715245,"3":0.0246376768,"4":0.1108581319,"5":0.1406719382,"6":0.1358105564,"7":0.1245863432,"8":0.1175445352,"9":0.1188479018,"10":0.1113148159,"11":0.117455495,"12":0.110555662,"13":0.1328567106,"14":0.103064284,"15":0.1119474442,"16":0.119390455,"17":0.1246727756,"18":0.1117827155,"19":0.1169972547},"Y":{"0":0.1241083714,"1":0.1394242378,"2":0.1225010796,"3":0.0077080173,"4":0.1198371354,"5":0.0029026989,"6":0.1259473297,"7":0.0,"8":0.0,"9":0.1214620231,"10":0.1204110739,"11":0.0,"12":0.1194570059,"13":0.0014971676,"14":0.1184584731,"15":0.1212061305,"16":0.1221438778,"17":0.0,"18":0.1209991075,"19":0.0},"Label":{"0":"17","1":"3","2":"17","3":"0","4":"14","5":"21","6":"16","7":"23","8":"20","9":"15","10":"14","11":"20","12":"14","13":"22","14":"13","15":"14","16":"15","17":"23","18":"14","19":"20"},"Probability":{"0":1.0,"1":1.0,"2":1.0,"3":1.0,"4":1.0,"5":1.0,"6":1.0,"7":1.0,"8":1.0,"9":1.0,"10":1.0,"11":1.0,"12":1.0,"13":1.0,"14":1.0,"15":1.0,"16":1.0,"17":1.0,"18":0.9101796407,"19":1.0}}
toy_data = pd.DataFrame(dict)

You will need numpy import numpy as np to convert the values to float

1 Comment

No, the hue variable can be categorical OR numeric. See documentation here seaborn.pydata.org/generated/seaborn.scatterplot.html

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.