Подтвердить что ты не робот

Настройка цвета разных баров в matplotlib Python

Возможно, у меня есть гистограмма, как показано ниже:

BarPlot

Любые идеи о том, как устанавливать разные цвета для каждого оператора? Например, AK будет красным, GA будет зеленым и т.д.?

Я использую Pandas и matplotlib в Python

>>> f=plt.figure()
>>> ax=f.add_subplot(1,1,1)
>>> ax.bar([1,2,3,4], [1,2,3,4])
<Container object of 4 artists>
>>> ax.get_children()
[<matplotlib.axis.XAxis object at 0x6529850>, <matplotlib.axis.YAxis object at 0x78460d0>,  <matplotlib.patches.Rectangle object at 0x733cc50>, <matplotlib.patches.Rectangle object at 0x733cdd0>, <matplotlib.patches.Rectangle object at 0x777f290>, <matplotlib.patches.Rectangle object at 0x777f710>, <matplotlib.text.Text object at 0x7836450>, <matplotlib.patches.Rectangle object at 0x7836390>, <matplotlib.spines.Spine object at 0x6529950>, <matplotlib.spines.Spine object at 0x69aef50>, <matplotlib.spines.Spine object at 0x69ae310>, <matplotlib.spines.Spine object at 0x69aea50>]
>>> ax.get_children()[2].set_color('r') #You can also try to locate the first patches.Rectangle object instead of direct calling the index.

В приведенных выше предложениях, как именно мы могли бы перечислить ax.get_children() и проверить, является ли тип объекта прямоугольником? Итак, если объект является прямоугольником, мы назначили бы другой случайный цвет?

4b9b3361

Ответ 1

Просто, просто используйте .set_color

>>> barlist=plt.bar([1,2,3,4], [1,2,3,4])
>>> barlist[0].set_color('r')
>>> plt.show()

enter image description here

Для вашего нового вопроса, не намного сложнее, просто нужно найти панель с вашей оси, например:

>>> f=plt.figure()
>>> ax=f.add_subplot(1,1,1)
>>> ax.bar([1,2,3,4], [1,2,3,4])
<Container object of 4 artists>
>>> ax.get_children()
[<matplotlib.axis.XAxis object at 0x6529850>, 
 <matplotlib.axis.YAxis object at 0x78460d0>,  
 <matplotlib.patches.Rectangle object at 0x733cc50>, 
 <matplotlib.patches.Rectangle object at 0x733cdd0>, 
 <matplotlib.patches.Rectangle object at 0x777f290>, 
 <matplotlib.patches.Rectangle object at 0x777f710>, 
 <matplotlib.text.Text object at 0x7836450>, 
 <matplotlib.patches.Rectangle object at 0x7836390>, 
 <matplotlib.spines.Spine object at 0x6529950>, 
 <matplotlib.spines.Spine object at 0x69aef50>,
 <matplotlib.spines.Spine object at 0x69ae310>, 
 <matplotlib.spines.Spine object at 0x69aea50>]
>>> ax.get_children()[2].set_color('r') 
 #You can also try to locate the first patches.Rectangle object 
 #instead of direct calling the index.

Если у вас есть сложный сюжет и вы хотите сначала определить бары, добавьте следующее:

>>> import matplotlib
>>> childrenLS=ax.get_children()
>>> barlist=filter(lambda x: isinstance(x, matplotlib.patches.Rectangle), childrenLS)
[<matplotlib.patches.Rectangle object at 0x3103650>, 
 <matplotlib.patches.Rectangle object at 0x3103810>, 
 <matplotlib.patches.Rectangle object at 0x3129850>, 
 <matplotlib.patches.Rectangle object at 0x3129cd0>, 
 <matplotlib.patches.Rectangle object at 0x3112ad0>]

Ответ 2

Я предполагаю, что вы используете Series.plot() для построения ваших данных. Если вы посмотрите на документы для Series.plot() здесь:

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Series.plot.html

отсутствует параметр цвета, где вы можете установить цвета для своей гистограммы.

Однако документы Series.plot() в конце списка параметров перечисляют следующее:

kwds : keywords
Options to pass to matplotlib plotting method

Это означает, что когда вы указываете аргумент вида для row.plot() как bar, Series.plot() будет фактически вызывать matplotlib.pyplot.bar(), а matplotlib.pyplot.bar() будет отправлен все дополнительные аргументы ключевого слова, которые вы указываете в конце списка аргументов для Series.plot().

Если вы изучите документы для метода matplotlib.pyplot.bar() здесь:

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

.. он также принимает аргументы ключевого слова в конце списка параметров, и если вы просматриваете список распознанных имен параметров, один из них является цветом, который может быть последовательностью, указывающей разные цвета для вашей гистограммы.

Объединяя все вместе, если вы укажете аргумент ключевого слова цвета в конце списка аргументов Series.plot(), аргумент ключевого слова будет передан методу matplotlib.pyplot.bar(). Вот доказательство:

import pandas as pd
import matplotlib.pyplot as plt

s = pd.Series(
    [5, 4, 4, 1, 12],
    index = ["AK", "AX", "GA", "SQ", "WN"]
)

#Set descriptions:
plt.title("Total Delay Incident Caused by Carrier")
plt.ylabel('Delay Incident')
plt.xlabel('Carrier')

#Set tick colors:
ax = plt.gca()
ax.tick_params(axis='x', colors='blue')
ax.tick_params(axis='y', colors='red')

#Plot the data:
my_colors = 'rgbkymc'  #red, green, blue, black, etc.

pd.Series.plot(
    s, 
    kind='bar', 
    color=my_colors,
)

plt.show()

enter image description here

Обратите внимание, что если в вашей последовательности больше баров, чем цветов, цвета будут повторяться.

Ответ 3

Обновление pandas 0.17.0

@Ответ на 7stud для новейшей версии pandas требует просто вызвать

s.plot( 
    kind='bar', 
    color=my_colors,
)

вместо

pd.Series.plot(
    s, 
    kind='bar', 
    color=my_colors,
)

Функции построения становятся членами объектов Series, DataFrame и на самом деле вызов pd.Series.plot с аргументом color дает ошибку