如何根据 pandas 列注释散点图中的点?
How to annotate points in a scatterplot based on a pandas column?
想要 'Age'
作为 x 轴,'Pos'
作为 y 轴,标签作为 'Player'
名称。但是由于某些原因,无法标记这些点。
代码:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import adjustText as at
data = pd.read_excel("path to the file")
fig, ax = plt.subplots()
fig.set_size_inches(7,3)
df = pd.DataFrame(data, columns = ['Player', 'Pos', 'Age'])
df.plot.scatter(x='Age',
y='Pos',
c='DarkBlue', xticks=([15,20,25,30,35,40]))
y = df.Player
texts = []
for i, txt in enumerate(y):
plt.text()
at.adjust_text(texts, arrowprops=dict(arrowstyle="simple, head_width=0.25, tail_width=0.05", color='black', lw=0.5, alpha=0.5))
plt.show()
数据汇总:
df.head()
Player Pos Age
0 Thibaut Courtois GK 28
1 Karim Benzema FW 32
2 Sergio Ramos DF 34
3 Raphael Varane DF 27
4 Luka Modric MF 35
错误:
ConversionError: Failed to convert value(s) to axis units: 'GK'
这是目前的情节;无法标记这些点:
编辑:
这就是我想要的,但最重要的是:
此外,谁能帮我重新排序 yaxis 上的标签。
比如,我想要 FW,MF,DF,GK 作为我的订单,但剧情是在 MF,DF,FW,GK 中。
谢谢。
描述了一个类似的解决方案 here。本质上,您想在散点图中注释点。
我已经剥离了你的代码。请注意,您需要使用 matplotlib
(而不是 pandas
)绘制数据:df = pd.DataFrame(data, columns = ['Player', 'Pos', 'Age'])
。这样,就可以使用annotation()
-方法了。
import matplotlib.pyplot as plt
import pandas as pd
# build data
data = [
['Thibaut Courtois', 'GK', 28],
['Karim Benzema', 'FW', 32],
['Sergio Ramos','DF', 34],
['Raphael Varane', 'DF', 27],
['Luka Modric', 'MF', 35],
]
# create pandas DataFrame
df = pd.DataFrame(data, columns = ['Player', 'Pos', 'Age'])
# open figure + axis
fig, ax = plt.subplots()
# plot
ax.scatter(x=df['Age'],y=df['Pos'],c='DarkBlue')
# set labels
ax.set_xlabel('Age')
ax.set_ylabel('Pos')
# annotate points in axis
for idx, row in df.iterrows():
ax.annotate(row['Player'], (row['Age'], row['Pos']) )
# force matplotlib to draw the graph
plt.show()
这就是您将获得的输出:
想要 'Age'
作为 x 轴,'Pos'
作为 y 轴,标签作为 'Player'
名称。但是由于某些原因,无法标记这些点。
代码:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import adjustText as at
data = pd.read_excel("path to the file")
fig, ax = plt.subplots()
fig.set_size_inches(7,3)
df = pd.DataFrame(data, columns = ['Player', 'Pos', 'Age'])
df.plot.scatter(x='Age',
y='Pos',
c='DarkBlue', xticks=([15,20,25,30,35,40]))
y = df.Player
texts = []
for i, txt in enumerate(y):
plt.text()
at.adjust_text(texts, arrowprops=dict(arrowstyle="simple, head_width=0.25, tail_width=0.05", color='black', lw=0.5, alpha=0.5))
plt.show()
数据汇总:
df.head()
Player Pos Age
0 Thibaut Courtois GK 28
1 Karim Benzema FW 32
2 Sergio Ramos DF 34
3 Raphael Varane DF 27
4 Luka Modric MF 35
错误:
ConversionError: Failed to convert value(s) to axis units: 'GK'
这是目前的情节;无法标记这些点:
编辑:
这就是我想要的,但最重要的是:
此外,谁能帮我重新排序 yaxis 上的标签。 比如,我想要 FW,MF,DF,GK 作为我的订单,但剧情是在 MF,DF,FW,GK 中。
谢谢。
描述了一个类似的解决方案 here。本质上,您想在散点图中注释点。
我已经剥离了你的代码。请注意,您需要使用 matplotlib
(而不是 pandas
)绘制数据:df = pd.DataFrame(data, columns = ['Player', 'Pos', 'Age'])
。这样,就可以使用annotation()
-方法了。
import matplotlib.pyplot as plt
import pandas as pd
# build data
data = [
['Thibaut Courtois', 'GK', 28],
['Karim Benzema', 'FW', 32],
['Sergio Ramos','DF', 34],
['Raphael Varane', 'DF', 27],
['Luka Modric', 'MF', 35],
]
# create pandas DataFrame
df = pd.DataFrame(data, columns = ['Player', 'Pos', 'Age'])
# open figure + axis
fig, ax = plt.subplots()
# plot
ax.scatter(x=df['Age'],y=df['Pos'],c='DarkBlue')
# set labels
ax.set_xlabel('Age')
ax.set_ylabel('Pos')
# annotate points in axis
for idx, row in df.iterrows():
ax.annotate(row['Player'], (row['Age'], row['Pos']) )
# force matplotlib to draw the graph
plt.show()
这就是您将获得的输出: