尝试在 Seaborn 散点图中添加色条

9
我是一名地质学硕士研究生,正在撰写关于南太平洋多座火山二氧化硫排放的论文。我对R有一些经验,但我的导师建议我使用Python(特别是JupyterLab)来生成图形和处理数据,所以我在编程方面还比较新手,主要是自学成才。我试图利用地震数据生成一些Seaborn散点图,但似乎无法在图例中显示地震震级的色彩条。下面是我使用的代码,我会尽力以清晰的方式格式化它。
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()

希望这足够清楚,如果需要更多信息,请告诉我! 图片:

image

1个回答

25

在关于Seaborn barplots的这个答案中采用的相同方法也可以应用于散点图。使用您的代码,看起来会像这样:

# ...
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()

这里输入图片描述


快接近了!我又遇到了一个错误,将 ax.get_legend().remove() 更改为 _ax.get_legend()_,这样就得到了我想要的结果,但所有数据点都是同一种颜色,所以现在我只需要弄清楚如何让它们注册为各自的大小。谢谢! - Wild.Geodude
@Wild.Geodude 对不起,我的代码还有另一个错误。现在应该按照你的期望工作了。 - William Miller
非常感谢,这正是我在寻找的!现在看起来完美无缺。 - Wild.Geodude
如何向色条添加标签? - Rylan Schaeffer
1
@RylanSchaeffer colorbar 方法接受关键字 label 来创建颜色条的标签。有关更多详细信息,请参见 此页面Notes 部分。 - William Miller
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接