2013-01-06 30 views
18

我想绘制熊猫数据框中的多行并为每行设置不同的选项。我想这样做Python熊猫,多行的绘图选项

testdataframe=pd.DataFrame(np.arange(12).reshape(4,3)) 
testdataframe.plot(style=['s-','o-','^-'],color=['b','r','y'],linewidth=[2,1,1]) 

这将引发一些错误消息:

  • 线宽不调用一个列表

  • 在风格上,我不能使用的'和'o'或任何其他字母符号,当定义列表中的颜色时

此外,还有一些更多的东西,这似乎怪我

  • 当我添加另一个阴谋命令将上面的代码testdataframe[0].plot()将绘制在同一张图上这条线,如果我添加命令testdataframe[[0,1]].plot()它会创建一个新的情节

  • 如果我会打电话testdataframe[0].plot(style=['s-','o-','^-'],color=['b','r','y'])很精致,在风格列表,但不与颜色列表

希望有人能帮助,谢谢。

回答

32

你太亲近了!

您可以在样式列表中指定的颜色:

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

testdataframe = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C']) 
styles = ['bs-','ro-','y^-'] 
linewidths = [2, 1, 4] 
fig, ax = plt.subplots() 
for col, style, lw in zip(testdataframe.columns, styles, linewidths): 
    testdataframe[col].plot(style=style, lw=lw, ax=ax) 

还要注意的是plot方法可以采取matplotlib.axes对象,这样你就可以多次调用像这样(如果你想):

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

testdataframe1 = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C']) 
testdataframe2 = pd.DataFrame(np.random.normal(size=(4,3)), columns=['D', 'E', 'F']) 
styles1 = ['bs-','ro-','y^-'] 
styles2 = ['rs-','go-','b^-'] 
fig, ax = plt.subplots() 
testdataframe1.plot(style=styles1, ax=ax) 
testdataframe2.plot(style=styles2, ax=ax) 

在这种情况下不太实际,但这个概念可能会在稍后派上用场。

+1

thx为您提供帮助,但这对线宽无帮助?我也想使用一些自定义的颜色,比如own_color ='#FF0000',然后就不能这样调用。 – Joerg

+0

然后我只能想到遍历列。请参阅我对第一个示例的编辑。 –

+3

是的,这就是我现在使用的。但我只是想知道他们是否只是这种笨拙的方式来完成这样一个简单的任务。但非常感谢您的帮助! – Joerg

6

考虑到数据帧testdataframe

testdataframe = pd.DataFrame(np.arange(12).reshape(4,3)) 

print(testdataframe) 

    0 1 2 
0 0 1 2 
1 3 4 5 
2 6 7 8 
3 9 10 11 

您可以结合styles成字符串的一个列表,在styles定义如下。我也将在lws

styles=['bs-', 'ro-', 'y^-'] 
lws = [2, 1, 1] 

定义线宽我们可以用plot方法上testdataframe通过列表stylesstyle参数。请注意,我们也可以传递字典(也可能是其他的东西)。

但是,线宽不容易处理。我首先捕获AxesSubplot对象并遍历线属性设置线宽。

ax = testdataframe.plot(style=styles) 
for i, l in enumerate(ax.lines): 
    plt.setp(l, linewidth=lws[i]) 

enter image description here

3

所以我认为,答案就在于通过颜色和样式相同的参数。以下示例适用于pandas 0.19。2:

testdataframe=pd.DataFrame(np.arange(12).reshape(4,3)) 
testdataframe.plot(style=['r*-','bo-','y^-'], linewidth=2.0) 

不幸的是,似乎将多行宽度作为matplotlib的输入传递是不可能的。