Matplotlib通过分类因子分散颜色

Matplotlib通过分类因子分散颜色,matplotlib,Matplotlib,我有一个基本的散射,其中x和y是浮动的。但是我想根据第三个分类变量更改标记的颜色。分类变量采用字符串形式。这似乎引起了一个问题 要使用iris数据集-以下是我想使用的代码: #Scatter of Petal x=df['Petal Length'] y=df['Petal Width'] z=df['Species'] plt.scatter(x, y, c=z, s=15, cmap='hot') plt.xlabel('Petal Width') plt.ylabel('Petal Len

我有一个基本的散射,其中x和y是浮动的。但是我想根据第三个分类变量更改标记的颜色。分类变量采用字符串形式。这似乎引起了一个问题

要使用iris数据集-以下是我想使用的代码:

#Scatter of Petal
x=df['Petal Length']
y=df['Petal Width']
z=df['Species']
plt.scatter(x, y, c=z, s=15, cmap='hot')
plt.xlabel('Petal Width')
plt.ylabel('Petal Length')
plt.title('Petal Width vs Length')
但我得到一个错误:无法将字符串转换为float:iris setosa

在运行之前是否必须将分类变量更改为数字变量,或者是否可以对当前格式的数据执行某些操作

谢谢

更新:整个回溯是:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-47-d67ee3bffc3b> in <module>()
      3 y=df['Petal Width']
      4 z=df['Species']
----> 5 plt.scatter(x, y, c=z, s=15, cmap='hot')
      6 plt.xlabel('Petal Width')
      7 plt.ylabel('Petal Length')

/Users/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/pyplot.pyc in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, hold, **kwargs)
   3198         ret = ax.scatter(x, y, s=s, c=c, marker=marker, cmap=cmap, norm=norm,
   3199                          vmin=vmin, vmax=vmax, alpha=alpha,
-> 3200                          linewidths=linewidths, verts=verts, **kwargs)
   3201         draw_if_interactive()
   3202     finally:

/Users/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, **kwargs)
   3605 
   3606         if c_is_stringy:
-> 3607             colors = mcolors.colorConverter.to_rgba_array(c, alpha)
   3608         else:
   3609             # The inherent ambiguity is resolved in favor of color

/Users/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/colors.pyc in to_rgba_array(self, c, alpha)
    420             result = np.zeros((nc, 4), dtype=np.float)
    421             for i, cc in enumerate(c):
--> 422                 result[i] = self.to_rgba(cc, alpha)
    423             return result
    424 

/Users/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/colors.pyc in to_rgba(self, arg, alpha)
    374         except (TypeError, ValueError) as exc:
    375             raise ValueError(
--> 376                 'to_rgba: Invalid rgba arg "%s"\n%s' % (str(arg), exc))
    377 
    378     def to_rgba_array(self, c, alpha=None):

ValueError: to_rgba: Invalid rgba arg "Iris-setosa"
to_rgb: Invalid rgb arg "Iris-setosa"
could not convert string to float: iris-setosa
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
3 y=df[‘花瓣宽度’]
4 z=df[“物种”]
---->5 plt.散射(x,y,c=z,s=15,cmap='hot')
6 plt.xlabel(“花瓣宽度”)
7 plt.ylabel(‘花瓣长度’)
/用户/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/pyplot.pyc分散(x、y、s、c、marker、cmap、norm、vmin、vmax、alpha、线宽、顶点、保持、**kwargs)
3198 ret=最大散射(x,y,s=s,c=c,marker=marker,cmap=cmap,norm=norm,
3199 vmin=vmin,vmax=vmax,alpha=alpha,
->3200线宽=线宽,顶点=顶点,**kwargs)
3201 draw_if_interactive()
3202最后:
/Users/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/axes//u axes.pyc分散(self、x、y、s、c、marker、cmap、norm、vmin、vmax、alpha、线宽、顶点、**kwargs)
3605
3606如果c_是严格的:
->3607 colors=mcolors.colorConverter.to_rgba_数组(c,alpha)
3608其他:
3609#固有的歧义被解决,有利于颜色
/用户/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/colors.pyc到_rgba_数组(self、c、alpha)
420结果=np.零((nc,4),数据类型=np.浮点)
421表示枚举(c)中的i,cc:
-->422结果[i]=自组织到rgba(cc,alpha)
423返回结果
424
/用户/mpgartland1/anaconda/lib/python2.7/site-packages/matplotlib/colors.pyc到_rgba(self、arg、alpha)
374除(类型错误、值错误)外,作为exc:
375升值错误(
-->376'到_rgba:无效的rgba参数“%s”\n%s“%”(str(arg),exc))
377
378 def到_rgba_阵列(自身、c、alpha=无):
ValueError:to_rgba:无效的rgba参数“Iris setosa”
to_rgb:无效的rgb参数“Iris setosa”
无法将字符串转换为浮点:iris setosa

回溯告诉您,不能将字符串传递给颜色参数。您可以传递颜色,也可以传递它将解释为颜色本身的值数组

见:

可能有一种更优雅的方式,但一种实现是以下方式(我使用了以下数据集:):

给出如下内容:


编辑:显式地为图例添加标签。

基于@jonnybazookatone答案,以下是我的方法。我使用groupby创建一个小数据框,用于在
Name
Name\u id
之间查找。然后我再次分组,迭代分组

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx
from pandas import read_csv

df = read_csv('iris.csv')

# map Name to integer
pos = df.loc[:,["Name"]].groupby("Name").count().reset_index()

# create a new column in the dataframe which contains the numeric value
tag_to_index = lambda x: pos.loc[pos.Name == x.Name].index[0]
df.loc[:,"name_index"]=df.loc[:,["Name"]].apply(tag_to_index, axis=1)

# Set the color map to match the number of species
hot = plt.get_cmap('hot')
cNorm  = colors.Normalize(vmin=0, vmax=len(pos))
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=hot)

# Get unique names of species
for (name, group) in df.groupby("name_index"):
    plt.scatter(group.PetalWidth, group.PetalLength, s=15, label=pos.iloc[name].get("Name"), color=scalarMap.to_rgba(name))

plt.xlabel('Petal Width')
plt.ylabel('Petal Length')
plt.title('Petal Width vs Length')
plt.legend()
plt.show()
这里应该很轻松

from altair import *
import pandas as pd

df = datasets.load_dataset('iris')
Chart(df).mark_point().encode(x='petalLength',y='sepalLength', color='species')

作为一般性评论,您应该给出所使用数据集的完整代码片段,以及完整的回溯错误。
from altair import *
import pandas as pd

df = datasets.load_dataset('iris')
Chart(df).mark_point().encode(x='petalLength',y='sepalLength', color='species')