根据聚类数据更改带有颜色条的 Matplotlib 二维散点图中的标记样式
Changing marker style in Matplotlib 2D scatter plot with colorbar according to cluster data
我正在进行聚类,并尝试用matplotlib的散点图函数绘制结果。
虚拟数据集是:
x = [48.959 49.758 49.887 50.593 50.683 ]
y = [122.310 121.29 120.525 120.252 119.509]
z = [136.993 133.128 143.710 129.088 139.860]
我正在使用以下代码绘制 x、y 并使用 z 作为色轴
plt.scatter(
x=x, y=y, c=z, label="CO2 Emissions Saved Cumulative", cmap=cm1)
Here is how it looks for the entire data
现在,我对我的数据集执行了 K 均值聚类,发现了三个聚类。例如
[0 0 0 0 0 2 1 2 1 2 1 1 2 1 1 1 2 2 2 2 2]
我找到了以下解决方案,通过区分标记样式来绘制它们
ax.scatter(x[cluster == 0], y[cluster == 0], marker="*")
ax.scatter(x[cluster == 1], y[cluster == 1], marker="^")
ax.scatter(x[cluster == 2], y[cluster == 2], marker="s")
现在的问题是,使用此方法,它会覆盖此示例图像中所示的色轴
cluster plot example
如何避免不更改标记的色轴并仍然使用色轴的默认 z 值。我希望绘图仅根据聚类数据更改标记样式。而不是根据集群数据更改颜色。谢谢
您需要将每个集群的 z-value 缩放到相同的比例,以便您可以为 3 个散点图提供统一的颜色条。您可以使用 Normalize
对象来执行此操作,并使用 norm=
.
将此规范化传递给散点图
x = np.array([48.959, 49.758, 49.887, 50.593, 50.683 ])
y = np.array([122.310, 121.29, 120.525, 120.252, 119.509])
z = np.array([136.993, 133.128, 143.710, 129.088, 139.860])
cluster = np.array([0, 1, 0, 2, 2])
mini, maxi = np.min(z), np.max(z)
norm = plt.Normalize(mini, maxi)
fig, ax = plt.subplots()
a = ax.scatter(x[cluster == 0], y[cluster == 0], marker="*", c=z[cluster == 0], norm=norm)
a = ax.scatter(x[cluster == 1], y[cluster == 1], marker="^", c=z[cluster == 1], norm=norm)
a = ax.scatter(x[cluster == 2], y[cluster == 2], marker="s", c=z[cluster == 2], norm=norm)
fig.colorbar(a)
使用 pandas
和 seaborn
库是针对大型数据集的更简洁、更可靠的解决方案:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
x = [48.959, 49.758, 49.887, 50.593, 50.683 ]
y = [122.310, 121.29, 120.525, 120.252, 119.509]
z = [136.993, 133.128, 143.710, 129.088, 139.860]
kmean = np.array([0, 1, 0, 2, 2])
df = pd.DataFrame({'x':x,'y':y,'z':z, 'km_z':kmean})
sns.scatterplot(data = df, x='x', y='y', hue='km_z', style='km_z')
产生以下输出
此外,您还可以使用 pandas.cut
函数绘制 bin(这是我经常需要生成图表的东西,我可以在其中使用第三个连续值作为参数)。使用方法是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
x = [48.959, 49.758, 49.887, 50.593, 50.683 ]
y = [122.310, 121.29, 120.525, 120.252, 119.509]
z = [136.993, 133.128, 143.710, 129.088, 139.860]
df = pd.DataFrame({'x':x,'y':y,'z':z})
df['bins'] = pd.cut(df.z, bins=3)
sns.scatterplot(data = df, x='x', y='y', hue='bins', style='bins')
并生成以下示例:
我使用后一种方法生成如下图表:
我正在进行聚类,并尝试用matplotlib的散点图函数绘制结果。
虚拟数据集是:
x = [48.959 49.758 49.887 50.593 50.683 ]
y = [122.310 121.29 120.525 120.252 119.509]
z = [136.993 133.128 143.710 129.088 139.860]
我正在使用以下代码绘制 x、y 并使用 z 作为色轴
plt.scatter(
x=x, y=y, c=z, label="CO2 Emissions Saved Cumulative", cmap=cm1)
Here is how it looks for the entire data
现在,我对我的数据集执行了 K 均值聚类,发现了三个聚类。例如
[0 0 0 0 0 2 1 2 1 2 1 1 2 1 1 1 2 2 2 2 2]
我找到了以下解决方案,通过区分标记样式来绘制它们
ax.scatter(x[cluster == 0], y[cluster == 0], marker="*")
ax.scatter(x[cluster == 1], y[cluster == 1], marker="^")
ax.scatter(x[cluster == 2], y[cluster == 2], marker="s")
现在的问题是,使用此方法,它会覆盖此示例图像中所示的色轴 cluster plot example
如何避免不更改标记的色轴并仍然使用色轴的默认 z 值。我希望绘图仅根据聚类数据更改标记样式。而不是根据集群数据更改颜色。谢谢
您需要将每个集群的 z-value 缩放到相同的比例,以便您可以为 3 个散点图提供统一的颜色条。您可以使用 Normalize
对象来执行此操作,并使用 norm=
.
x = np.array([48.959, 49.758, 49.887, 50.593, 50.683 ])
y = np.array([122.310, 121.29, 120.525, 120.252, 119.509])
z = np.array([136.993, 133.128, 143.710, 129.088, 139.860])
cluster = np.array([0, 1, 0, 2, 2])
mini, maxi = np.min(z), np.max(z)
norm = plt.Normalize(mini, maxi)
fig, ax = plt.subplots()
a = ax.scatter(x[cluster == 0], y[cluster == 0], marker="*", c=z[cluster == 0], norm=norm)
a = ax.scatter(x[cluster == 1], y[cluster == 1], marker="^", c=z[cluster == 1], norm=norm)
a = ax.scatter(x[cluster == 2], y[cluster == 2], marker="s", c=z[cluster == 2], norm=norm)
fig.colorbar(a)
使用 pandas
和 seaborn
库是针对大型数据集的更简洁、更可靠的解决方案:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
x = [48.959, 49.758, 49.887, 50.593, 50.683 ]
y = [122.310, 121.29, 120.525, 120.252, 119.509]
z = [136.993, 133.128, 143.710, 129.088, 139.860]
kmean = np.array([0, 1, 0, 2, 2])
df = pd.DataFrame({'x':x,'y':y,'z':z, 'km_z':kmean})
sns.scatterplot(data = df, x='x', y='y', hue='km_z', style='km_z')
产生以下输出
此外,您还可以使用 pandas.cut
函数绘制 bin(这是我经常需要生成图表的东西,我可以在其中使用第三个连续值作为参数)。使用方法是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
x = [48.959, 49.758, 49.887, 50.593, 50.683 ]
y = [122.310, 121.29, 120.525, 120.252, 119.509]
z = [136.993, 133.128, 143.710, 129.088, 139.860]
df = pd.DataFrame({'x':x,'y':y,'z':z})
df['bins'] = pd.cut(df.z, bins=3)
sns.scatterplot(data = df, x='x', y='y', hue='bins', style='bins')
并生成以下示例:
我使用后一种方法生成如下图表: