matplotlib Python / Seaborn -如何在散点图中绘制每个值的名称

mrwjdhj3  于 2023-01-13  发布在  Python
关注(0)|答案(2)|浏览(301)

首先,如果我在写这篇文章的时候对任何错误发表评论,对不起,英语不是我的第一语言。
我是一个初学者与数据可视化与python,我有一个数据框与115行,我想做一个散点图与4象限,并显示在R1的值(下图供参考)
enter image description here
现在这是我的散点图。这是一个足球运动员的数据集,所以我想在R1中画出球员的名字。这可能吗?
enter image description here

roejwanj

roejwanj1#

你可以用plt.annotate,根据玩家的x/y值,为你所关心的象限中的玩家创建一个子 Dataframe ,以此来标注每个点。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

##### Making a mock dataset #################################################
names = ['one', 'two', 'three', 'four', 'five', 'six']
value_1 = [1, 2, 3, 4, 5, 6]
value_2 = [1, 2, 3, 4, 5, 6]

df = pd.DataFrame(zip(names, value_1, value_2), columns = ['name', 'v_1', 'v_2'])
#############################################################################

plt.rcParams['figure.figsize'] = (10, 5) # sizing parameter to make the graph bigger
ax1 = sns.scatterplot(x = value_1, y = value_2, s = 100) # graph code

# Code to make a subset of data that fits the specific conditions that I want to annotate
quadrant = df[(df.v_1 > 3) & (df.v_2 > 3)].reset_index(drop = True)

# Code to annotate the above "quadrant" on the graph
for x in range(len(quadrant)):
    plt.annotate('Player: {}\nValue 1: {}\nValue 2: {}'.format(quadrant.name[x], quadrant.v_1[x], quadrant.v_2[x]),
                 (quadrant.v_1[x], quadrant.v_2[x])

输出图:

如果你只是在笔记本上工作,不需要保存所有球员的名字,那么使用“悬停”功能可能是一个更好的主意。注解每个球员的名字可能会变得过于忙碌的图表,所以只是悬停在点上可能会更适合你。

%matplotlib widget # place this or "%matplotlib notebook" at the top of your notebook
                   # This allows you to work with matplotlib graphs in line

import mplcursors # this is the module that allows hovering features on your graph

# using the same dataframe from above
ax1 = sns.scatterplot(x = value_1, y = value_2, s = 100)
@mplcursors.cursor(ax1, hover=2).connect("add") # add the plot to the hover feature of mplcursors
def _(sel):
    sel.annotation.set_text('Player: {}\nValue 1: {}\nValue 2: {}'.format(df.name[sel.index], sel.target[0], sel.target[0])) # set the text

    # you don't need any of the below but I like to customize
    sel.annotation.get_bbox_patch().set(fc="lightcoral", alpha=1) # set the box color
    sel.annotation.arrow_patch.set(arrowstyle='-|>', connectionstyle='angle3', fc='black', alpha=.5) # set the arrow style

悬停输出示例:第一节第一节第一节第二节第一节

cwtwac6a

cwtwac6a2#

您可以在单个图形上绘制两个(或更多)散点图。
如果我正确理解了您要做的事情,您可以将数据集分为两部分:
1.不希望为其绘制名称的点
1.要为其打印名称的点
然后可以绘制第二个数据集并显示名称。
如果没有关于问题的任何其他详细信息,就很难做更多的工作。您可以编辑您的问题并添加数据集的最小示例。

相关问题