2015-09-11 60 views
2

我想在熊猫中绘制一些数据,并且内置的绘图功能方便地绘制每列一行。我想要做的是根据我所做的分类手动为每行分配一种颜色。指定大熊猫的线条颜色

以下工作:

df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2]}) 
s = pd.Series(['c','y'], index=['1','2']) 
df.plot(color = s) 

但是,当我的指标是整数,它不再工作,并抛出为KeyError异常:

df = pd.DataFrame({1: [1, 2, 3, 4], 2: [1, 2, 1, 2]}) 
s = pd.Series(['c','y'], index=[1,2]) 
df.plot(color = s) 

我的理解是,当一个整数索引的使用方式它不知何故必须从0开始。这是我的猜测,因为以下的作品也是如此:

df = pd.DataFrame({0: [1, 2, 3, 4], 1: [1, 2, 1, 2]}) 
s = pd.Series(['c','y'], index=[1,0]) 
df.plot(color = s) 

我的问题是:

  • 这里发生了什么事?
  • 假设我有一个整数索引不是从0开始或者不是由连续数字组成的,我怎样才能使这项工作无需将索引转换为从0开始的字符串或重新索引?

编辑:

我意识到,即使是在第一种情况下,代码没有做什么,我希望它做的事。 似乎像大熊猫匹配DataFrame和Series的索引,只有两者都是从0开始的整数索引。如果不是这种情况,则抛出KeyError,或者如果索引是str,则使用元素的顺序。

这是正确的吗?有没有一种方法来匹配Series和DataFrame索引?或者我必须确保按照正确的顺序传递颜色列表?

+0

您不希望索引匹配。您正在将Series索引与DataFrame的列进行匹配。 – thecircus

回答

4

这里发生了什么事?

关键字参数颜色是继承自matplotlib.pyplot.plot()。文档中的详细信息并不清楚您绘制时可以放入颜色列表。鉴于该颜色是matplotlib的关键字参数,我建议不要使用熊猫系列来保存颜色值。

我该如何做这项工作?

使用列表而不是系列。如果您使用的系列的索引旨在将DataFrame的列与特定颜色相匹配,则需要先对系列进行排序。如果列不合适,您还需要sort the columns

# Option 1 
s = s.sort_index() 
df.plot(color = s.values) # as per Fiabetto's answer 

# Option 2 
df.plot(color = ['c', 'y') 
+0

我最终对Series和DataFrame进行了排序,然后将系列转换为建议的列表。这没有问题,但我希望有一个更优雅的方式,但我可以看到,如果颜色关键字对应matplotlibs(显然对系列一无所知)如何不可能。 – GebitsGerbils

+0

是的,不幸的是Pandas只是matplotlib的包装。 matplotlib允许用户几乎任何东西,但它可以变得非常混乱。 – thecircus

+0

选项2中的代码行错过了关闭']'。 – MERose

3

尝试:

df.plot(color = s.values) 

这将指定的颜色无论指标中的规模。

编辑:

我想有三列:

df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2], '3': [4, 3, 2, 1]}) 
s = pd.Series(['c','y','r'], index=[1,3,2]) 
df.plot(color = s.sort_index().values) 

和排序它的作品系列。

+0

这确实有效,但我意识到实际问题似乎是顺序。我将编辑该问题以包括该问题! – GebitsGerbils

+1

仅当DataFrame的列按顺序排列时才有助于排序。 – thecircus