【问题标题】:Trying to add a colorbar to a Seaborn scatterplot尝试向 Seaborn 散点图添加颜色条
【发布时间】:2020-11-03 03:22:21
【问题描述】:

我是一名地质学硕士生,正在撰写我的论文,重点是南太平洋一些火山的二氧化硫输出。我对 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()

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

【问题讨论】:

    标签: python matplotlib seaborn scatter-plot colormap


    【解决方案1】:

    this answer 中使用的有关 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)
    
    # ...
    

    请参阅this question 及其答案,了解有关操纵颜色条的标签和刻度的信息。

    使用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()
    

    【讨论】:

    • 感谢您的帮助!我尝试使用该版本的代码,但我不断收到错误 AttributeError: 'tuple' object has no attribute 'get_legend' 我已经搜索过但我不太确定需要修复什么在那里。
    • @Wild.Geodude 看起来ax 不是我想象的那样。试试编辑后的代码,它应该可以工作。
    • 越来越近了!我遇到了另一个错误并将 ax.get_legend().remove() 更改为 ax.get_legend() 这给了我想要的东西,但所有数据点都是一种颜色,所以现在我只需要弄清楚如何让它们注册为各自的大小。谢谢!
    • @Wild.Geodude 抱歉,我的代码中还有另一个错误。它现在应该可以正常工作了
    • 非常感谢,这正是我想要的!现在看起来很完美。
    猜你喜欢
    • 2021-02-28
    • 2020-02-15
    • 2015-05-28
    • 2021-07-11
    • 2020-10-10
    • 2020-10-29
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多