2017-01-04 4 views
1

У меня есть набор данных, содержащий около 9800 записей. Один столбец содержит имена пользователей (около 60 индивидуальных имен пользователей). Я хочу создать график рассеяния в matplotlib и назначить разные цвета для разных пользователей.Автоматически назначать цвета для рассеивания графика с помощью matplotlib?

Это в основном то, что я делаю:

import matplotlib.pyplot as plt 
import pandas as pd 

x = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30] 
y = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600] 
users =['mark', 'mark', 'mark', 'rachel', 'rachel', 'rachel', 'jeff', 'jeff', 'jeff', 'lauren', 'lauren', 'lauren'] 

#this is how the dataframe basicaly looks like  
df = pd.DataFrame(dict(x=x, y=y, users=users) 

#I go on an append the df with colors manually 
#I'll just do it the easy albeit slow way here 

colors =['red', 'red', 'red', 'green', 'green', 'green', 'blue', 'blue', 'blue', 'yellow', 'yellow', 'yellow'] 

#this is the dataframe I use for plotting 
df1 = pd.DataFrame(dict(x=x, y=y, users=users, colors=colors) 

plt.scatter(df1.x, df1.y, c=df1.colors, alpha=0.5) 
plt.show() 

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

У меня есть два вопроса:

(1) Есть ли способ, чтобы назначить цвета автоматически для отдельных пользователей? (2) Если да, есть ли способ назначить цветовую схему или палитру?

+0

Возможного дубликат [Scatter участков в панде/Pyplot: Как построить по категории] (http://stackoverflow.com/ вопросы/21654635/scatter-plot-in-pandas-pyplot-how-to-plot-by-category) – tom

+0

@tom Я так не думаю. Мне нужен способ динамического назначения столбца цвета в фрейм данных. Вопрос, который вы предлагаете, относится к сгруппированным графикам, а не к цвету. – Rachel

ответ

2
user_colors = {} 
unique_users = list(set(users)) 
step_size = (256**3) // len(unique_users) 
for i, user in enumerate(unique_users): 
    user_colors[user] = '#{}'.format(hex(step_size * i)[2:]) 

Тогда у вас есть словарь (user_colors), где каждый пользователь получил один уникальный цвет.

colors = [user_colors[user] for user in users] 

Теперь у вас есть свой массив с отличным цветом для каждого пользователя

+0

Спасибо! Кажется, я понимаю, что вы делаете. Однако могу ли я применить его и к кадру данных pandas? Как это будет работать? – Rachel