python - 如何调试 Matplotlib 中的散点图?

标签 python matplotlib

我有以下 df:

df = pd.DataFrame([
    ['A', 'X', '2020-10-01', 1],
    ['A', 'X', '2020-10-02', 2], 
    ['A', 'X', '2020-10-03', 3], 
    ['A', 'Y', '2020-10-01', 4],
    ['A', 'Y', '2020-10-02', 5], 
    ['A', 'Y', '2020-10-03', 6],
    ['B', 'Z', '2020-10-01', 7],
    ['B', 'Z', '2020-10-02', 8], 
    ['B', 'Z', '2020-10-03', 9], 
    ['B', 'Z', '2020-10-01', 10],
    ['B', 'Z', '2020-10-02', 11], 
    ['B', 'Z', '2020-10-03', 12],    
],
    columns=['Q', 'W', 'DT', 'V']
)

我想创建一个散点图:

fig, ax = plt.subplots(figsize=(12, 8), frameon=False)
fig.suptitle('Plotz', fontsize=16)
ax.set_title('DF Plot')
ax.scatter(x=df.DT, y=df.W, s=df.V)

这创建了以下图表:

enter image description here

我想弄清楚到底发生了什么,因为图表上有 9 个数据点,而数据中有 12 个数据点。注释图表不起作用,它会在第一行注释 2 个值。

for i, txt in enumerate(df.V):
    ax.annotate(txt, (df.DT[i], df.W[i]), fontsize=14)

当 x,y 对有多个值时(如本例),是否有办法弄清楚幕后到底发生了什么?

更新:可能我没说清楚。在这种情况下,Matplotlib 的默认行为是什么?它是最后的值(value)胜利吗?我怎样才能在图上显示实际值? (与显示两个值的注释代码不同,这在绘图上显示了真实值)。

在谷歌搜索更多之后我认为答案是:

Visualization of scatter plots with overlapping points in matplotlib

最佳答案

通常情况下,点是按照遇到的顺序绘制的,一个在另一个之上。如果没有透明度,最后绘制的将是可见的,而较早的将只显示一些边框,以防它们更大。

因此,调试这种情况的一种方法是设置一个 alpha 值,使点透明。彼此重叠的多个点会显示得更暗并且有一些边框。

使用给定的测试数据,下面的代码放大大小并设置 alpha。随着点尺寸变得非常大,需要调整轴限制。使用多种颜色会更加强调重叠。

ax.scatter(x=df.DT, y=df.W, s=df.V*150, alpha=0.4)
plt.xlim(-1,3)
plt.ylim(-1,3)

resulting plot

另一种方法是添加抖动:向每个点位置添加一些小的随机噪声。在数值数据的情况下,可以将抖动直接添加到数据中。如果是分类数据,可以在调用 scatter 后修改位置:

import numpy as np
dots = ax.scatter(x=df.DT, y=df.W, s=df.V)
offsets =  dots.get_offsets()
jittered_offsets = offsets + np.random.uniform(-0.1, 0.1, offsets.shape)
dots.set_offsets(jittered_offsets)

使用原始颜色和大小,并且没有 alpha,这会清楚地将注意力吸引到重叠的点上: jittered plot

还有另一种方法,如果两个轴都是分类的,则仅根据位置进行计数并包围出现多次的位置:

import collections
dots = ax.scatter(x=df.DT, y=df.W, s=df.V)
offsets =  dots.get_offsets()
counts = collections.Counter([(x,y)  for x, y in offsets])
suspects = [p for p in counts if counts[p] >= 2]
ax.scatter([x for x, _ in suspects], [y for _, y in suspects], ec='crimson', lw=1, fc='none', s=50)

encercled plot

当然,可以根据实际数据的具体情况组合使用不同的方法(alpha、颜色、抖动、环绕)。

关于python - 如何调试 Matplotlib 中的散点图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60154441/

相关文章:

python - 为另一个数据框中的每一行重复 pandas 行的更有效方法?

python - 从python中的二进制数据中获取unicode字符串

python - 如何限制每个循环读取带有引号的多个字符串作为Python中的单个字符串?

python - 文件读取和RE解析

Python ggplot 问题绘制 >8 只股票和图例被截断

python - 为什么使用 FuncAnimation 绘图时点不移动?

python - 如何用多个分隔符分割字符串并存储在列表中?

python - 有没有更好的方法使用 Matplotlib 绘制正交轴?

python - python seaborn 图中的图例标签不正确

Python matplotlib - 使用用户定义函数的 meshgrid 格式化