#python #pandas #seaborn
#python #панды #seaborn
Вопрос:
Итак, я сделал полосу с помощью seaborn самым простым способом, с 5 различными категориями:
sns.set_style('whitegrid')
plt.figure(figsize=(35,20))
sns.set(font_scale = 3)
sns.stripplot(df.speed, df.routeID, hue=df.speed>50, jitter=0.2, alpha=0.5, size=10, edgecolor='black')
plt.xlabel("Speed", size=40)
plt.ylabel("route ID", size=40)
plt.title("Velocity stripplot", size=50)
Теперь дело в том, что я хочу иметь разные оттенки для каждой категории, скажем, скорость более 50 км / ч для первой категории, 30 км / ч для второй и так далее. Возможно ли это? Я пытался сделать это, передавая список для оттенка:
hue=([("ROUTE 30">50),("ROUTE 104">0)])
но это отмечает: SyntaxError: invalid syntax
Дело в том, что я хочу сделать все это сразу (поскольку наиболее очевидным ответом было бы построить отдельно) на одном и том же участке, как это можно сделать?
РЕДАКТИРОВАТЬ: я последовал предложенному ответу. Используется тот же код:
plt.figure(figsize=(20,7))
my_palette = ['b' if x > 82 else 'g' for x in df.speed.values]
sns.stripplot(df.speed, df.routeID, jitter=0.2, alpha=0.5, size=8, edgecolor='black', palette = my_palette)
но получилось не так, как ожидалось:
Я не понимаю, что здесь не так. Есть идеи?
Комментарии:
1. Мне не хватало запятой (сразу после «списка оттенков»), после чего сообщение изменилось на: ошибка типа: «>» не поддерживается между экземплярами «str» и «int»
2. Похоже, что ваш
speed
столбец не содержит чисел.3. Не проблема со столбцом скорости. С первым сравнением в вашем примере:
("Route 30" > 50)
вы сравниваете строку «Маршрут 30» с числом 50, что не имеет смысла.
Ответ №1:
Я предлагаю создать отдельный столбец df
для точечного цвета. попробуйте это:
# INITIAL DATA
n = 1000
df = pd.DataFrame()
df['speed'] = np.random.randint(10,90,n)
df['routeID'] = np.random.choice(['ROUTE_5','ROUTE_66','ROUTE_95','ROUTE_101'], n)
# set hue indices to match your conditions
df['hue'] = 'normal' # new column with default value
df.loc[df.speed > 50, 'hue'] = 'fast'
df.loc[(df.routeID=="ROUTE_5") amp; (df.speed>40)|
(df.routeID=="ROUTE_66") amp; (df.speed>30)|
(df.routeID=="ROUTE_95") amp; (df.speed>60),
'hue'] = 'special'
palette = {'normal':'g','fast':'r','special':'magenta'}
sns.stripplot(x=df.speed, y=df.routeID, size=15,
hue=df.hue, palette=palette)
Комментарии:
1. Это вообще не сработало, но я полностью ценю помощь.
2. Привет, Джон Доу, я изменил пример решения — проверьте это. Это должно сработать.