Попытка добавить цветовую шкалу на диаграмму рассеяния Seaborn - PullRequest
1 голос
/ 14 июля 2020

Я учусь в магистратуре геологии и работаю над своей диссертацией, посвященной выбросам двуокиси серы из ряда вулканов в Южном Тихом океане c. У меня есть небольшой опыт работы с R, но мой руководитель рекомендовал python (в частности, JupyterLab) для генерации цифр и обработки данных, поэтому я новичок в программировании и, по сути, учусь как я go. Я пытаюсь использовать данные о землетрясении для создания диаграмм рассеяния с использованием морского изображения, но я не могу получить цветную полосу для отображения в легенде магнитуды землетрясения. Код, который я использую, приведен ниже, и я сделаю все возможное, чтобы его четко отформатировать.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy import stats
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt

затем наборы данных, с которыми я работаю. Это наборы данных о землетрясениях.

df = pd.read_csv('Vanuatu Earthquakes May18-May19.csv')
df = pd.read_csv('Vanuatu Earthquakes May17-May18.csv')
df = pd.read_csv('Vanuatu Earthquakes May19-Jul20.csv')

и местоположения вулканов, чисто для пространственной привязки.

dg = pd.read_csv('Volcano coordinates.csv')

Вот основной сюжет, с которым я пытаюсь работать. он стоит на данный момент. До сих пор я мог классифицировать магнитуды землетрясений с помощью функции оттенка, но мне не нравится, как это выглядит в легенде, и я хочу преобразовать его в цветовую шкалу (или использовать шкалу цветов вместо оттенка, либо / или) , за исключением того, что я не могу понять, как это сделать. В качестве альтернативы, если есть другая функция, которая дала бы мне результаты, которые я ищу, я определенно открыт для нее, а не для диаграммы рассеяния. Также черные треугольники - это вулканы, поэтому пока их можно игнорировать.

plt.figure(figsize=(5.5,9))
sns.scatterplot(x='longitude', y='latitude', data=df, 
                marker='D', hue='mag', palette='colorblind', cmap='RdBu')
sns.scatterplot(x='longitude', y='latitude', data=dg, 
                marker='^', legend='brief', color='k', s=100)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., title='Magnitude (Mw)')
plt.xlabel('Longitude (degrees)')
plt.ylabel('Latitude (degrees)')
plt.title('Earthquake and Volcano Locations', size=15)
plt.show()

образ

Надеюсь, это достаточно ясно, но дайте мне знать, если потребуется дополнительная информация!

1 Ответ

1 голос
/ 14 июля 2020

Тот же метод, который использовался в этом ответе относительно диаграмм Seaborn, может быть применен и к диаграмме рассеяния. С вашим кодом это будет выглядеть примерно так:

# ...
norm = plt.Normalize(df['mag'].min(), df['mag'].max())
sm = plt.cm.ScalarMappable(cmap="RdBu", norm=norm)
sm.set_array([])

ax = sns.scatterplot(x='longitude', y='latitude', data=df, marker='D', palette='RdBu', hue='mag')
sns.scatterplot(x='longitude', y='latitude', data=dg, marker='^', 
                legend='brief', color='k', s=100, ax=ax)

# Remove the legend and add a colorbar (optional)
# ax.get_legend().remove()
# ax.figure.colorbar(sm)

# ...

См. этот вопрос и его ответы для получения информации о манипулировании метками и отметками на цветной полосе.

Для полного примера с использованием набора данных tips:

import seaborn as sns
import matplotlib.pyplot as plt

sns.set()
tips = sns.load_dataset("tips")
ax = sns.scatterplot(x="total_bill", y="tip", hue="size", palette='RdBu', data=tips)

norm = plt.Normalize(tips['size'].min(), tips['size'].max())
sm = plt.cm.ScalarMappable(cmap="RdBu", norm=norm)
sm.set_array([])

# Remove the legend and add a colorbar
ax.get_legend().remove()
ax.figure.colorbar(sm)

plt.show()

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

...