当异常值导致图的其余部分缺乏对比色时,如何最好地可视化数据?

数据挖掘 可视化 绘图 地理空间 matplotlib
2022-02-11 02:26:05

matplotlib.pyplot我使用Python 3根据其地区的人口绘制了以下菲律宾地图:

在此处输入图像描述

可以看出,有一个省份(红色)是异常值。看数据就清楚了:

 population = [16.892118644067804,
 27.13259740259741,
 27.325479452054793,
 25.502352941176472,
 29.62087999999999,
 25.593870967741932,
 27.649384615384616,
 25.38908450704225,
 26.924931506849322,
 26.636250000000004,
 27.317105263157895,
 26.58338345864662,
 29.48689393939393,
 28.283986013986016,
 26.563118279569903,
 23.037142857142857,
 24.2674]

这使得情节“没有吸引力”——如果这个地区的数据不是异常值,其他地区的对比色会更多。我有什么选择来纠正这个问题?

  1. 删除该地区的数据。在这种情况下,该区域将显示为白色(未着色),其余区域将具有对比色。但无论出于何种原因,目前这对我来说不是一个选择。
  2. 手动调整该数据点以与其他数据点“混合”(类似于所有其他数据点的平均值,甚至是与其他数据点相当接近的手工值,如 22 或其他)。我试过这个,这确实提供了更多对比色。问题是,这是对数据的歪曲。所以,如果可能的话,我想避免它。
  3. 在颜色图中进一步向下拉伸黄色,以便只为红色留出一点空间。也就是说,不是 2 种颜色开始在颜色栏中的 24 左右从一种颜色过渡到另一种颜色,而是应该在 19 左右这样做。有人知道该怎么做吗?

还有其他想法吗?解决此问题的最佳实践方法有哪些?

2个回答

我会推荐两种简单但有效的方法:

  1. 像这样的异常值通常很容易通过计算值的均值和标准差来发现,并且可能您可以将颜色间隔设置在:之间。这会将异常值“剪裁”到通用最大值。[μσ,μ+σ]

  2. 分箱 - 选择足够的箱号并将一些国家组合在一起,而不是为特定国家提供特定颜色。你可以这样想——真的26.92493150684932226.636250000000004真的有什么不同吗?您可以通过将其用作您拥有的物品数量的函数来获得参数化的垃圾箱数量。喜欢:countries/2

使用 Wolfram 语言,您可以使用自定义颜色缩放GeoRegionValuePlot的选项.ColorFunction

有一些菲律宾的数据。"AdministrativeDivision" "Population"

popPH = EntityValue[
   Entity["Country", "Philippines"]["AdministrativeDivisions"],
   "Population",
   "EntityAssociation"];

First@Normal@popPH

数学图形

然后GeoRegionValuePlot有和没有自定义ColorFunction

linear = GeoRegionValuePlot[popPH,
  ColorFunction -> ColorData["SolarColors"],
  PlotLabel -> "Linear ColorFunction",
  PlotLegends -> Placed[Automatic, Below]
  ];

log = GeoRegionValuePlot[popPH,
  ColorFunctionScaling -> False,
  ColorFunction -> (ColorData["SolarColors"][
      Rescale[Log@#, Log@QuantityMagnitude@MinMax[popPH]]] &),
  PlotLabel -> "Log ColorFunction",
  PlotLegends -> Placed[Automatic, Below]
  ];

Row[{linear, log}]

数学图形

希望这可以帮助。