我想要实现的是一种更优雅、更直接的方法,使用来自同一行的相应标签来注释 pandas 数据框中的 x 和 y 位置的点。
这个工作示例有效并产生了我想要的结果,但我觉得必须有一个更优雅的解决方案,而不必首先将各个列存储在单独的列表中并迭代它们。
我担心的是,在存在缺失值、nan等的较大且复杂的数据集的情况下,拥有这些单独的列表可能会导致标签与数据不一致。
在此示例中,x = 温度,y = 销售额,标签是日期。
import pandas as pd
import matplotlib.pyplot as plt
d = {'Date': ['15-08-24', '16-08-24', '17-08-24'], 'Temperature': [24, 26, 20], 'Sales': [100, 150, 90]}
df = pd.DataFrame(data=d)
这给出了:
Date Temperature Sales
0 15-08-24 24 100
1 16-08-24 26 150
2 17-08-24 20 90
然后:
temperature_list = df['Temperature'].tolist()
sales_list = df['Sales'].tolist()
labels_list = df['Date'].tolist()
fig, axs = plt.subplots()
axs.scatter(data=df, x='Temperature', y='Sales')
for i, label in enumerate(labels_list):
axs.annotate(label, (temperature_list[i], sales_list[i]))
plt.show()
我的目标 - 但不起作用 - 是这样的:
fig, axs = plt.subplots()
axs.scatter(data=df, x='Temperature', y='Sales')
axs.annotate(data=df, x='Temperature', y='Sales', text='Date') # this is invalid
plt.show()
欢迎提出建议。如果没有办法绕过迭代过程,也许至少有一种自动防故障方法来保证标签正确归属于相应的数据点。
我不知道有什么简单的方法可以实现这一点而不是循环,我同意这很痛苦。 如果可以使用plotlyexpress代替matplotlib/seaborn,这会变得容易得多:
import pandas as pd
import plotly.express as px
d = {'Date': ['15-08-24', '16-08-24', '17-08-24'], 'Temperature': [24, 26, 20], 'Sales': [100, 150, 90]}
df = pd.DataFrame(data=d)
fig = px.scatter(df, x='Temperature',y='Sales',text='Date')
fig.update_traces(textposition='top center')