Python:突出显示,标记或指示(散点)图中的点

时间:2019-07-25 14:58:38

标签: python dataframe matplotlib

更新

再尝试一些,我成功地运行了这段代码,没有错误:

from matplotlib.pyplot import figure

dict = pd.DataFrame({"Return": mkw_returns, "Standard Deviation": mkw_stds})
dict.head()
#plt.annotate("Sharpe Ratio", xytext=(0.5,0.5), xy=(0.03,0.03) ,  arrowprops=dict(facecolor='blue', shrink=0.01, width=220)) # arrowprops={width = 3, "facecolor":
#dict.plot(x="Standard Deviation", y = "Return", kind="scatter", figsize=(10,6))
#plt.xlabel("Standard Deviations")
#plt.ylabel("log_Return YoY")
figure(num=None, figsize=(15, 10), dpi=100, facecolor='w', edgecolor='k')
plt.plot( 'Standard Deviation', 'Return', data=dict, linestyle='none', marker='o')
plt.xlabel("Standard Deviations")
plt.ylabel("log_Return YoY")

    # Annotate with text + Arrow
plt.annotate(
# Label and coordinate
'This is a Test', xy=(0.01, 1), xytext=(0.01, 1), color= "r", arrowprops={"facecolor": 'black', "shrink": 0.05}
)

现在可以使用Yay,有人可以阐明这个问题吗?我不确定为什么它突然开始起作用。谢谢 :) 另外,我将如何简单地标记一个点,而不是使用箭头?

问题:无法弄清楚如何在散点图中标记/选择/突出显示特定点

(Python 3初学者)

因此,我的目标是要突出显示散点图中的一个或多个点,并附上文字或图例提供一些文字。

https://imgur.com/a/VWeO1EH

(信誉不佳,无法发布图片,对不起)

dict = pd.DataFrame({"Return": mkw_returns, "Standard Deviation": mkw_stds})
dict.head()
#plt.annotate("Sharpe Ratio", xytext=(0.5,0.5), xy=(0.03,0.03) ,  arrowprops=dict(facecolor='blue', shrink=0.01, width=220)) # arrowprops={width = 3, "facecolor":
dict.plot(x="Standard Deviation", y = "Return", kind="scatter", figsize=(10,6))
plt.xlabel("Standard Deviations")
plt.ylabel("log_Return YoY")

被禁止的“ plt.annotate”将出现以下错误。

具体来说,我想选择锐度比,但是现在,如果我设法在散点图中选择任何一点,我会很高兴。

我真的很困惑如何使用matplotlib,因此欢迎您提供任何帮助

我尝试了以下在线找到的解决方案:

I) 这显示了一种在图表中使用注释,以箭头标记特定点的简单方法。 https://www.youtube.com/watch?v=ItHDZEE5wSk

但是pd.dataframe环境不喜欢注释,我得到了错误:

TypeError: 'DataFrame' object is not callable

II) 由于Im在数据框环境中遇到注释问题,因此我研究了以下解决方案

Annotate data points while plotting from Pandas DataFrame

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import string

df = pd.DataFrame({'x':np.random.rand(10), 'y':np.random.rand(10)}, 
                  index=list(string.ascii_lowercase[:10]))
fig, ax = plt.subplots()
df.plot('x', 'y', kind='scatter', ax=ax, figsize=(10,6))

for k, v in df.iterrows():
    ax.annotate(k, v)


但是,除了这个非常长的水平滚动条之外,当应用于我的问题时,结果图未显示任何注释

https://imgur.com/a/O8ykmeg

III) 此外,我偶然发现了该解决方案,使用标记而不是箭头

Matplotlib annotate with marker instead of arrow

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

x=[1,2,3,4,5,6,7,8,9,10]
y=[1,1,1,2,10,2,1,1,1,1]
line, = ax.plot(x, y)

ymax = max(y)
xpos = y.index(ymax)
xmax = x[xpos]

# Add dot and corresponding text
ax.plot(xmax, ymax, 'ro')
ax.text(xmax, ymax+2, 'local max:' + str(ymax))

ax.set_ylim(0,20)
plt.show()

但是,当将代码应用于我的情况时,代码绝对不起作用

dict = pd.DataFrame({"Return": mkw_returns, "Standard Deviation": mkw_stds})
dict.head()
plt.annotate("Sharpe Ratio", xytext=(0.5,0.5), xy=(0.03,0.03) ,  arrowprops=dict(facecolor='blue', shrink=0.01, width=220)) # arrowprops={width = 3, "facecolor":
dict.plot(x="Standard Deviation", y = "Return", kind="scatter", figsize=(10,6))
plt.xlabel("Standard Deviations")
plt.ylabel("log_Return YoY")


ymax = max(y)
xpos = y.index(ymax)

xmax = x[xpos]

# Add dot and corresponding text
ax.plot(xmax, ymax, 'ro')
ax.text(xmax, ymax+2, 'local max:' + str(ymax))

ax.set_ylim(0,20)
plt.show()

IV) 最后,我尝试了一种在pd.dataframe中使用箭头显然可以完美工作的解决方案, https://python-graph-gallery.com/193-annotate-matplotlib-chart/

# Library
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Basic chart
df=pd.DataFrame({'x': range(1,101), 'y': np.random.randn(100)*15+range(1,101) })
plt.plot( 'x', 'y', data=df, linestyle='none', marker='o')

# Annotate with text + Arrow
plt.annotate(
# Label and coordinate
'This point is interesting!', xy=(25, 50), xytext=(0, 80),

# Custom arrow
arrowprops=dict(facecolor='black', shrink=0.05)
)

但是运行此代码会产生与上述相同的错误:

TypeError: 'DataFrame' object is not callable

版本:

import sys; print(sys.version)
3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

很抱歉,但我认为最好将我一起尝试过的所有内容都写在一篇文章中。 感谢您的任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

我认为以下是一种解决方案,如上面发布的“ UPDATE”所示:

更新

再尝试一些,我成功地运行了这段代码,没有错误:

from matplotlib.pyplot import figure

dict = pd.DataFrame({"Return": mkw_returns, "Standard Deviation": mkw_stds})
dict.head()
#plt.annotate("Sharpe Ratio", xytext=(0.5,0.5), xy=(0.03,0.03) ,  arrowprops=dict(facecolor='blue', shrink=0.01, width=220)) # arrowprops={width = 3, "facecolor":
#dict.plot(x="Standard Deviation", y = "Return", kind="scatter", figsize=(10,6))
#plt.xlabel("Standard Deviations")
#plt.ylabel("log_Return YoY")
figure(num=None, figsize=(15, 10), dpi=100, facecolor='w', edgecolor='k')
plt.plot( 'Standard Deviation', 'Return', data=dict, linestyle='none', marker='o')
plt.xlabel("Standard Deviations")
plt.ylabel("log_Return YoY")

    # Annotate with text + Arrow
plt.annotate(
# Label and coordinate
'This is a Test', xy=(0.01, 1), xytext=(0.01, 1), color= "r", arrowprops={"facecolor": 'black', "shrink": 0.05}
)

还有一个问题,我该如何使用其他标记或颜色并在图例中写出来?

预先感谢:)