散点图颜色条看起来不正确
scatter plot color bar does not look right
我已经编写了代码来创建右侧带有颜色条的散点图。但是颜色条看起来不对,因为颜色太浅而无法映射到绘图中使用的实际颜色。我不确定这里缺少什么或错了什么。但我希望得到类似于此处显示的内容:https://medium.com/@juliansteam/what-bert-topic-modelling-reveal-about-the-2021-unrest-in-south-africa-d0d15629a9b4(大约在页面中间)
df = .... # data loading
df["topic"] = topics
# Plot parameters
top_n = topn
fontsize = 15
# some data preparation
to_plot = df.copy()
to_plot[df.topic >= top_n] = -1
outliers = to_plot.loc[to_plot.topic == -1]
non_outliers = to_plot.loc[to_plot.topic != -1]
#the actual plot
fig, ax = plt.subplots(figsize=(15, 15))
scatter_outliers = ax.scatter(outliers['x'], outliers['y'], color="#E0E0E0", s=1, alpha=.3)
scatter = ax.scatter(non_outliers['x'], non_outliers['y'], c=non_outliers['topic'], s=1, alpha=.3, cmap='hsv_r')
ax.text(0.99, 0.01, f"BERTopic - Top {top_n} topics", transform=ax.transAxes, horizontalalignment="right", color="black")
plt.xticks([], [])
plt.yticks([], [])
plt.colorbar(scatter)
plt.savefig(outfile+"_1.png", format='png', dpi=300)
plt.clf()
plt.close()
如您所见,示例图如下所示。颜色条已创建,但与上面 link 中显示的颜色条相比,颜色很浅,似乎与散点图上的颜色不符。有什么建议么?
颜色条使用给定的alpha=.3
。在散点图中,许多相同颜色的点叠加在一起,导致它们看起来比单个点更亮。
解决这个问题的一种方法是创建一个 ScalarMappable
对象供颜色条使用,采用颜色图和散点图的范数(但不是它的 alpha)。请注意,只需更改散点对象的 alpha (scatter.set_alpha(1)
) 也会更改绘图本身。
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
import numpy as np
x = np.random.normal(np.repeat(np.random.uniform(0, 20, 10), 1000))
y = np.random.normal(np.repeat(np.random.uniform(0, 10, 10), 1000))
c = np.repeat(np.arange(10), 1000)
scatter = plt.scatter(x, y, c=c, cmap='hsv_r', alpha=.3, s=3)
plt.colorbar(ScalarMappable(cmap=scatter.get_cmap(), norm=scatter.norm))
plt.tight_layout()
plt.show()
我已经编写了代码来创建右侧带有颜色条的散点图。但是颜色条看起来不对,因为颜色太浅而无法映射到绘图中使用的实际颜色。我不确定这里缺少什么或错了什么。但我希望得到类似于此处显示的内容:https://medium.com/@juliansteam/what-bert-topic-modelling-reveal-about-the-2021-unrest-in-south-africa-d0d15629a9b4(大约在页面中间)
df = .... # data loading
df["topic"] = topics
# Plot parameters
top_n = topn
fontsize = 15
# some data preparation
to_plot = df.copy()
to_plot[df.topic >= top_n] = -1
outliers = to_plot.loc[to_plot.topic == -1]
non_outliers = to_plot.loc[to_plot.topic != -1]
#the actual plot
fig, ax = plt.subplots(figsize=(15, 15))
scatter_outliers = ax.scatter(outliers['x'], outliers['y'], color="#E0E0E0", s=1, alpha=.3)
scatter = ax.scatter(non_outliers['x'], non_outliers['y'], c=non_outliers['topic'], s=1, alpha=.3, cmap='hsv_r')
ax.text(0.99, 0.01, f"BERTopic - Top {top_n} topics", transform=ax.transAxes, horizontalalignment="right", color="black")
plt.xticks([], [])
plt.yticks([], [])
plt.colorbar(scatter)
plt.savefig(outfile+"_1.png", format='png', dpi=300)
plt.clf()
plt.close()
如您所见,示例图如下所示。颜色条已创建,但与上面 link 中显示的颜色条相比,颜色很浅,似乎与散点图上的颜色不符。有什么建议么?
颜色条使用给定的alpha=.3
。在散点图中,许多相同颜色的点叠加在一起,导致它们看起来比单个点更亮。
解决这个问题的一种方法是创建一个 ScalarMappable
对象供颜色条使用,采用颜色图和散点图的范数(但不是它的 alpha)。请注意,只需更改散点对象的 alpha (scatter.set_alpha(1)
) 也会更改绘图本身。
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
import numpy as np
x = np.random.normal(np.repeat(np.random.uniform(0, 20, 10), 1000))
y = np.random.normal(np.repeat(np.random.uniform(0, 10, 10), 1000))
c = np.repeat(np.arange(10), 1000)
scatter = plt.scatter(x, y, c=c, cmap='hsv_r', alpha=.3, s=3)
plt.colorbar(ScalarMappable(cmap=scatter.get_cmap(), norm=scatter.norm))
plt.tight_layout()
plt.show()