如何在标记透明度标准化的情况下创建散点图

问题描述 投票:0回答:1

我有这个数据框:

import pandas as pd
import matplotlib.pyplot as plt

rng = np.random.default_rng(seed=111)
rints = rng.integers(low=0, high=1000, size=(5,5))
df = pd.DataFrame(rints)

     0    1    2    3    4
0  474  153  723  169  713
1  505  364  658  854  767
2  718  109  141  797  463
3  968  130  246  495  197
4  450  338   83  715  787

我正在尝试按原样绘制它并设置标记的大小及其透明度:

ox = np.arange(len(df))
x = np.tile(ox[:, np.newaxis], (1, len(ox)))
y = np.tile(ox, (len(df), 1))

plt.scatter(x, y, marker='o', color='tab:orange', ec='k', ls='--', s=df.values)

for ix,iy,v in zip(x.ravel(), y.ravel(), df.values.ravel()):
    plt.annotate(str(v), (ix,iy), textcoords='offset points', xytext=(0,10), ha='center')
        
plt.axis("off")
plt.margins(y=0.2)
plt.show()

只有两个问题:

  1. 该图没有反映真实的数据框形状,我觉得它被转置了
  2. 我不知道如何像调整大小那样调整散点的透明度

您能帮忙修复并做到这一点吗?谢谢你们。

python pandas matplotlib scatter-plot transparency
1个回答
2
投票

为避免转置,请正确映射

x
y
(此处使用
numpy.meshgrid
),并使用
alpha
scatter
参数(matplotlib ≥ 3.4):

# inverting df to have the same row order
df2 = df[::-1]

# computing meshgrid
x, y = np.meshgrid(range(df.shape[0]), range(df.shape[1]))

# plotting
plt.scatter(x, y, marker='o', color='tab:orange', ec='k', ls='--',
            s=df2, alpha=df2.div(np.max(df2)))

for ix,iy,v in zip(x.ravel(), y.ravel(), df2.to_numpy().ravel()):
    plt.annotate(str(v), (ix,iy), textcoords='offset points',
                 xytext=(0,10), ha='center')
        
plt.axis("off")
plt.margins(y=0.2)
plt.show()

输出:

© www.soinside.com 2019 - 2024. All rights reserved.