Цвет по значению столбца в Matplotlib

Одним из моих любимых аспектов использования библиотеки ggplot2 в R является способность легко определять эстетику. Я могу быстро сделать диаграмму рассеяния и применить цвет, связанный с конкретным столбцом, и я бы с удовольствием мог это сделать с помощью python/pandas/matplotlib. Мне интересно, есть ли какие-либо удобные функции, которые люди используют для сопоставления цветов с значениями с использованием кадровых фреймов pandas и Matplotlib?

##ggplot scatterplot example with R dataframe, 'df', colored by col3
ggplot(data = df, aes(x=col1, y=col2, color=col3)) + geom_point()

##ideal situation with pandas dataframe, 'df', where colors are chosen by col3
df.plot(x=col1,y=col2,color=col3)

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

import pandas as pd
df = pd.DataFrame({'Height':np.random.normal(10),
                   'Weight':np.random.normal(10),
                   'Gender': ["Male","Male","Male","Male","Male",
                              "Female","Female","Female","Female","Female"]})

Ответ 1

Обновление октября 2015 г.

Seaborn отлично справляется с этим прецедентом:

import numpy 
import pandas
from  matplotlib import pyplot
import seaborn
seaborn.set(style='ticks')

numpy.random.seed(0)
N = 37
_genders= ['Female', 'Male', 'Non-binary', 'No Response']
df = pandas.DataFrame({
    'Height (cm)': numpy.random.uniform(low=130, high=200, size=N),
    'Weight (kg)': numpy.random.uniform(low=30, high=100, size=N),
    'Gender': numpy.random.choice(_genders, size=N)
})

fg = seaborn.FacetGrid(data=df, hue='Gender', hue_order=_genders, aspect=1.61)
fg.map(pyplot.scatter, 'Weight (kg)', 'Height (cm)').add_legend()

Что сразу выводит:

enter image description here

Старый ответ

В этом случае я бы использовал matplotlib напрямую.

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

def dfScatter(df, xcol='Height', ycol='Weight', catcol='Gender'):
    fig, ax = plt.subplots()
    categories = np.unique(df[catcol])
    colors = np.linspace(0, 1, len(categories))
    colordict = dict(zip(categories, colors))  

    df["Color"] = df[catcol].apply(lambda x: colordict[x])
    ax.scatter(df[xcol], df[ycol], c=df.Color)
    return fig

if 1:
    df = pd.DataFrame({'Height':np.random.normal(size=10),
                       'Weight':np.random.normal(size=10),
                       'Gender': ["Male","Male","Unknown","Male","Male",
                                  "Female","Did not respond","Unknown","Female","Female"]})    
    fig = dfScatter(df)
    fig.savefig('fig1.png')

И это дает мне:

scalle plot with categorized colors Насколько я знаю, этот цветной столбец может быть любым совместимым с matplotlib цветом (кортежи RBGA, имена HTML, шестнадцатеричные значения и т.д.).

У меня возникли проблемы с получением каких-либо цифр, кроме числовых значений для работы с цветовыми картами.

Ответ 2

На самом деле вы можете использовать ggplot для python:

from ggplot import *
import numpy as np
import pandas as pd

df = pd.DataFrame({'Height':np.random.randn(10),
                   'Weight':np.random.randn(10),
                   'Gender': ["Male","Male","Male","Male","Male",
                              "Female","Female","Female","Female","Female"]})


ggplot(aes(x='Height', y='Weight', color='Gender'), data=df)  + geom_point()

ggplot in python

Ответ 3

Вы можете использовать параметр color для метода plot, чтобы определить цвета, которые вы хотите для каждого столбца. Например:

from pandas import DataFrame
data = DataFrame({'a':range(5),'b':range(1,6),'c':range(2,7)})
colors = ['yellowgreen','cyan','magenta']
data.plot(color=colors)

Three lines with custom colors

Вы можете использовать названия цветов или шестнадцатеричные коды цвета, такие как "# 000000" для черного цвета. Вы можете найти все определенные имена цветов в файле matplotlib color.py. Ниже приведена ссылка для файла color.py в matplotlib github repo.

https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/colors.py