在seaborn stripp中为点添加标签

2024-10-04 01:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我用seaborn上的条纹图来显示一系列金属中心的d轨道的能量。在

以下是数据帧:

        dxy      dyz      dz2      dxz   dx2-y2
Fe -0.25336 -0.24661 -0.22991 -0.07644 -0.16229
Co -0.38294 -0.38050 -0.34952 -0.21271 -0.27173
Ni -0.47550 -0.47504 -0.46817 -0.44385 -0.45632

使用这段代码,我很接近我想要的(结果图如下):

^{pr2}$

我想把每个轨道的名字(dxy,dxz等等),作为标签,放在每个点的右边(或者最好的位置),在这个例子中,哈哈。在

任何帮助都是非常感谢的。在

注:我可以看到在结尾生成的数字缺少Y轴上的部分数字。为什么?在

更新

我在尝试@ImportanceOfBeingErnest提出的解决方案。仅使用其中一个标记进行测试,目前,我得到的这个AttributeError: 'NoneType' object has no attribute 'update'是一个长时间的回溯,对我来说没有太大意义。这是我的代码:

dxy = sns.stripplot(x=df.index, y="dxy", data=df, jitter=False, dodge=True, size=44, marker="_", linewidth=2)
for line in range(0, df.shape[0]):
    dxy.text(df.index[line], df.dxy[line], "teste", horizontalalignment='right', size='medium', color='black')

enter image description here


Tags: 数据代码dfsizeindexline数字seaborn
1条回答
网友
1楼 · 发布于 2024-10-04 01:32:21
    g.text(x=i+0.1, y=df[df.columns[j]].values[i]+0.001, s=df.columns[j], horizontalalignment='right', size='medium', color='black')

你想如何在(x,y)坐标系中加减数字

数据:(山姆.csv)

^{pr2}$

代码:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib.lines import Line2D
import random

df = pd.read_csv('sam.csv').reset_index()
df.index = df['d']
del df['d']
print(df.columns)
print(df)
ax = plt.figure(figsize=(10, 7))
colors = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])
             for i in range(len(df.columns) - 1)]
# colors = ['#FFAA11', '#11AA11', '#55AA31', '#11BA81', '#CCABAA']

columns = list(df.columns)
for j in range(1, len(df.columns)):
    color = colors[j-1]
    g = sns.stripplot(x=df.index, y=columns[j], data=df, jitter=False, dodge=True, size=44, marker="_", linewidth=2,
                      color=color)

for j in range(1, len(df.columns)):

    for i in range(len(df)):
        g.text(x=i+0.1, y=df[df.columns[j]].values[i]+0.001, s=df.columns[j], horizontalalignment='right', size='medium', color='black')

elements = [Line2D([0], [0], color=colors[i]) for i in range(len(df.columns)-1)]

ax.legend(handles=elements, labels=list(df.columns)[1:])

plt.ylabel("Energy (Eh)")
plt.savefig('svm_conf.png', dpi=400)
plt.show()

输出:

Index(['index', 'dxy', 'dyz', 'dz2', 'dxz', 'dx2-y2'], dtype='object')

enter image description here


代码中的问题:

在更新的代码中dxy.text(df.index[line], df.dxy[line], "teste", horizontalalignment='right', size='medium', color='black')

这里的x=df.index[line]是字符串,它应该是数字,因为它是文本的坐标


第二种方法:

for j in range(1, len(df.columns)):
    flag = True
    for i in range(len(df)):
        if flag is True:
            delta = 0.3
            align = 'left'
            flag = False
        else:
            delta = -0.2
            align = 'right'
            flag = True
        g.text(x=i+delta, y=df[df.columns[j]].values[i], s=df.columns[j], horizontalalignment=align, size='medium', color='black')

输出:

enter image description here

相关问题 更多 >