Python pandas, варианты построения нескольких строк

Я хочу построить несколько строк из фрейма pandas и задать разные параметры для каждой строки. Я хотел бы сделать что-то вроде

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']), это прекрасно со списком в стиле, но не со списком в цвете

Надеюсь, кто-то может помочь, спасибо.

Ответы

Ответ 1

Ты так близко!

Вы можете указать цвета в списке стилей:

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)

В этом случае не очень практично, но концепция может пригодиться позже.

Ответ 2

С учетом кадра данных 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, передавая список styles параметру style. Обратите внимание, что мы могли бы также передать словарь (и, возможно, другие вещи).

Однако ширина строк не так легко обрабатывается. Сначала я захватываю объект AxesSubplot и перебираю атрибут линий, задающий ширину линии.

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

введите описание изображения здесь

Ответ 3

Итак, я думаю, что ответ заключается в передаче цвета и стиля в том же аргументе. Следующий пример работает с pandas 0.19.2:

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

К сожалению, кажется, что передача нескольких строк в качестве входа в matplotlib невозможна.