简体   繁体   English

Matplotlib 指示 X 和 Y 轴上的点

[英]Matplotlib Indicate Point on X and Y Axis

I often want to highlight a point along a curve using matplotlib to make a plot that looks like:我经常想使用matplotlib突出显示曲线上的一个点来绘制如下所示的图: 基本图

The following code was used to create the plot以下代码用于创建绘图

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

y  = np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])/100.
x = 100. - np.array([
    99.79,98.96,98.65,98.39,98.13,97.88,97.61,97.33,97.01,96.65,96.21,
    95.72,95.16,94.46,93.52,92.31,90.66,88.48,84.04,79.34,19.32])
ax = plt.subplot(111)
line = plt.plot(x,y)


def highlight_point(ax,line,point,linestyle=':'):
    c = line.get_color()
    xmin = ax.get_xlim()[0]
    ymin = ax.get_ylim()[0]

    ax.plot([xmin,point[0]],[point[1],point[1]],color=c,linestyle=linestyle)
    ax.plot([point[0],point[0]],[ymin,point[1]],color=c,linestyle=linestyle)

plt.xlim([0,85])
plt.ylim([0,1])
highlight_point(ax,line[0],[x[10],y[10]])
plt.show()

The above method fails when the xlim and ylim are failed to be entered or if another plot were added to the figure later.当无法输入xlimylim或稍后将另一个图添加到图中时,上述方法将失败。 I would like some combination of axhline or hlines where I can specify the left/bottom of the plot to a certain mathematical point.我想要一些axhlinehlines组合,我可以在其中指定绘图的左侧/底部到某个数学点。

A way to go could be to update the lines each time the canvas gets redrawn.一种方法可能是每次重新绘制画布时更新线条。 To this end we could create a class PointMarkers with an update method that is connected to the draw_event listener.为此,我们可以使用连接到draw_event侦听器的更新方法创建一个类PointMarkers This way the lines will update not only if points are added after the marker lines' creation, but also when the canvas is resized or panned.这样,不仅在标记线创建后添加点时,线会更新,而且在调整画布大小或平移时也会更新。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

class PointMarker():
    def __init__(self, ax, point, **kwargs):
        self.ax = ax
        self.point = point
        if "line" in kwargs:
            self.c = kwargs.get("line").get_color()
        else:
            self.c = kwargs.get("color", "b")
        self.ls=kwargs.get("linestyle", ':')
        self.vline, = self.ax.plot([],[],color=self.c,linestyle=self.ls)
        self.hline, = self.ax.plot([],[],color=self.c,linestyle=self.ls)
        self.draw()

    def draw(self):
        xmin = ax.get_xlim()[0]
        ymin = ax.get_ylim()[0]
        self.vline.set_data([self.point[0], self.point[0]], [ymin,self.point[1]])
        self.hline.set_data([xmin, self.point[0]], [self.point[1], self.point[1]])

class PointMarkers():
    pointmarkers = []
    def add(self,ax, point, **kwargs ):
        pm = PointMarker(ax, point, **kwargs)
        self.pointmarkers.append(pm)
    def update(self, event=None):
        for pm in self.pointmarkers:
            pm.draw()

x = np.arange(1,17)
y = np.log(x)
ax = plt.subplot(111)
line = plt.plot(x,y)

# register the markers
p = PointMarkers()
p.add(ax,[x[5],y[5]], line=line[0])
p.add(ax,[x[12],y[12]], color="purple", linestyle="-.")
# connect event listener
cid = plt.gcf().canvas.mpl_connect("draw_event", p.update)

#testing: draw some new points or change axis limits
plt.plot([5,11],[-0.5,0.6])
#plt.xlim([0,85])
#plt.ylim([0,1])

plt.show()

在此处输入图片说明

For saving, the redrawing would need to be performed manually directly before the save command, like为了保存,需要在保存命令之前直接手动执行重绘,例如

plt.gcf().canvas.draw()
plt.savefig(...)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM