我想用对应于每个数据点的图像来注解散点图。使用标准参数时,图像最终会相互冲突,并与其他重要特征(如图例轴等)冲突。因此,我希望图像围绕主散点图形成一个圆形或矩形。
我的代码现在看起来像这样,我正在努力修改它,以组织围绕情节中心点的图像。
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
提前感谢你的帮助
1条答案
按热度按时间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点)。