python 如何在散点图周围均匀分布注解图像框?

cwtwac6a  于 2023-02-15  发布在  Python
关注(0)|答案(1)|浏览(222)

我想用对应于每个数据点的图像来注解散点图。使用标准参数时,图像最终会相互冲突,并与其他重要特征(如图例轴等)冲突。因此,我希望图像围绕主散点图形成一个圆形或矩形。
我的代码现在看起来像这样,我正在努力修改它,以组织围绕情节中心点的图像。

import matplotlib.cbook as cbook
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import seaborn as sns

#Generate n points around a 2d circle
def generate_circle_points(n, centre_x, center_y, radius=1):
    """Generate n points around a circle.
    Args:
        n (int): Number of points to generate.
        centre_x (float): x-coordinate of circle centre.
        center_y (float): y-coordinate of circle centre.
        radius (float): Radius of circle.
    Returns:
        list: List of points.
    """

    points = []
    for i in range(n):
        angle = 2 * np.pi * i / n
        x = centre_x + radius * np.cos(angle)
        y = center_y + radius * np.sin(angle)
        points.append([x, y])

    return points

fig, ax = plt.subplots(1, 1, figsize=(7.5, 7.5))

data = pd.DataFrame(data={'x': np.random.uniform(0.5, 2.5, 20),
                          'y': np.random.uniform(10000, 50000, 20)})

with cbook.get_sample_data('grace_hopper.jpg') as image_file:
    image = plt.imread(image_file)

# Set logarithmic scale for x and y axis
ax.set(xscale="log", yscale='log')
# Add grid
ax.grid(True, which='major', ls="--", c='gray')

coordianates = generate_circle_points(n=len(data),
                                      centre_x=0, center_y=0, radius=10)

# Plot the scatter plot
scatter = sns.scatterplot(data=data, x='x', y='y', ax=ax)
for index, row in data.iterrows():

    imagebox = OffsetImage(image, zoom=0.05)
    imagebox.image.axes = ax
    xy = np.array([row['x'], row['y']])
    xybox = np.array(coordianates[index])
    ab = AnnotationBbox(imagebox, xy,
                        xycoords='data',
                        boxcoords="offset points",
                        xybox=xybox,
                        pad=0)

    ax.add_artist(ab)

目前,输出如下所示:enter image description here
理想情况下,我希望输出如下所示:enter image description here
提前感谢你的帮助

rhfm7lfc

rhfm7lfc1#

不是回答,而是长长的评论:
您可以control the location of the arrows,但有时将图形导出为SVG并在Adobe Illustrator或Inkscape中编辑它们更容易。
R有一个dodge参数,这个参数非常好,但即使这样也不总是完美的。Python中有解决方案,但很费力。
主要的问题是,这需要最后做,因为情节的改变会使它有问题。有几点需要提到。
你的数字必须有固定的大小(科学版为57毫米/121毫米/184毫米,RSC版为83毫米/171毫米,ACS版为83毫米/178毫米等),如果需要在Illustrator中缩放图形,请注意缩放因子,将其添加为画布外的文本框-因为根据墨菲定律,底层情节至少需要替换一次。以正确的大小导出SVG是理想的。听起来很傻,但它很有帮助。同样,确保字体大小不低于最小规格(7-9点)。

相关问题