41

我想从熊猫数据框中绘制多条线并为每条线设置不同的选项。我想做类似的事情

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

这将引发一些错误消息:

  • 线宽不能用列表调用

  • 在样式中,在列表中定义颜色时,我不能使用“s”和“o”或任何其他字母符号

还有一些我觉得很奇怪的东西

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

  • 如果我愿意的话testdataframe[0].plot(style=['s-','o-','^-'],color=['b','r','y']),可以使用样式列表,但不能使用颜色列表

希望有人能帮忙,谢谢。

4

3 回答 3

69

你这么近!

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

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)

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

于 2013-01-06T06:35:53.407 回答
22

所以我认为答案在于在同一个参数中传递颜色和样式。以下示例适用于 pandas 0.19.2:

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

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

于 2017-03-16T04:47:11.257 回答
21

考虑数据框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方法。请注意,我们也可以传递字典(可能还有其他东西)。testdataframestylesstyle

然而,线宽不是那么容易处理的。我首先捕获AxesSubplot对象并遍历设置线条宽度的线条属性。

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

在此处输入图像描述

于 2017-03-15T21:13:06.400 回答