【问题标题】:Make the seaborn hue legend logarithmic使 seaborn 色调图例对数化
【发布时间】:2022-12-11 22:45:49
【问题描述】:

我有两个独立的线性变量和一个相关的指数变量。

x = range(100)
y = range(100)
z = [2**i for i in range(100)]
df = pd.DataFrame({"x":x,"y":y,"z":z})

sns.scatterplot(
    x=df.x,
    y=df.y,
    hue=df.z
)

  1. 我怎样才能使色相比例对数化,从而显示数据中的模式?
  2. 我可以防止图例以科学记数法显示大数吗?

    Pyplot 仅包含 x 和 y 轴刻度的设置器,我只发现了如何将图例更改为离散值。

【问题讨论】:

    标签: python pandas matplotlib seaborn


    【解决方案1】:

    要使用 Seaborn 库使散点图中的色相比例为对数,您可以使用 set() 方法并将 colorscale 参数设置为“log”:

    sns.scatterplot(
        x=df.x,
        y=df.y,
        hue=df.z
    ).set(colorscale='log')
    

    这将使图中的颜色分布更均匀,这有助于揭示数据中的模式,这些模式可能无法通过线性比例立即显现出来。

    为防止图例以科学记数法显示大量数字,您可以在创建绘图时使用 tickformat 参数。此参数允许您使用与 Python 中的 str.format() 方法相同的语法为刻度标签指定自定义格式字符串。例如,要禁止科学计数,显示所有带两位小数的数字,可以使用如下代码:

    sns.scatterplot(
        x=df.x,
        y=df.y,
        hue=df.z
    ).set(colorscale='log',
          tickformat='.2f')
    

    这将导致图例显示带有两位小数的数字,而不是对大数字使用科学记数法。

    请注意,tickformat 参数仅在色相轴为数字时有效。如果色调值是分类的,则可以使用 hue_norm 参数指定归一化函数,并使用 hue_order 参数指定绘制类别的顺序。然后,您可以使用 legend_out 参数将图例移到绘图区域之外,这有助于防止过度拥挤。例如:

    sns.scatterplot(
        x=df.x,
        y=df.y,
        hue=df.z,
        hue_norm=(0, 2**10),
        hue_order=list(range(0, 2**10, 2**8)),
        legend_out=True
    ).set(colorscale='log')
    

    这将在对数刻度上绘制色调值,标准化范围为 0 到 1024,类别的顺序固定。图例将放置在绘图区域之外,并且将显示没有科学记数法的色调值。您可以根据需要调整参数以自定义图的外观。

    【讨论】:

      猜你喜欢
      • 2020-10-24
      • 2021-07-06
      • 2020-08-05
      • 2018-10-16
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2020-12-16
      相关资源
      最近更新 更多