如何在散点图中绘制线 [英] How to draw line inside a scatter plot

查看:238
本文介绍了如何在散点图中绘制线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不敢相信这是如此复杂,但是我尝试并搜索了一段时间.

I can't believe that this is so complicated but I tried and googled for a while now.

我只想分析一些图形功能的散点图. 首先,我只想添加一行.

I just want to analyse my scatter plot with a few graphical features. For starters, I want to add simply a line.

因此,我有几(4)个点,我想在该点上添加一条线,如下图所示(来源:

So, I have a few (4) points and I want to add a line to it, like in this plot (source: http://en.wikipedia.org/wiki/File:ROC_space-2.png)

现在,这行不通.坦率地说,matplotlib的documentation-examples-gallery组合和内容是获取信息的不好来源.

Now, this won't work. And frankly, the documentation-examples-gallery combo and content of matplotlib is a bad source for information.

我的代码基于画廊中的一个简单散点图:

My code is based upon a simple scatter plot from the gallery:

# definitions for the axes
left, width = 0.1, 0.85 #0.65
bottom, height = 0.1, 0.85 #0.65
bottom_h = left_h = left+width+0.02

rect_scatter = [left, bottom, width, height]

# start with a rectangular Figure
fig = plt.figure(1, figsize=(8,8))
axScatter = plt.axes(rect_scatter)

# the scatter plot:
p1 = axScatter.scatter(x[0], y[0], c='blue', s = 70)
p2 = axScatter.scatter(x[1], y[1], c='green', s = 70)
p3 = axScatter.scatter(x[2], y[2], c='red', s = 70)
p4 = axScatter.scatter(x[3], y[3], c='yellow', s = 70)
p5 = axScatter.plot([1,2,3], "r--")

plt.legend([p1, p2, p3, p4, p5], [names[0], names[1], names[2], names[3], "Random guess"], loc = 2)

# now determine nice limits by hand:
binwidth = 0.25
xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] )
lim = ( int(xymax/binwidth) + 1) * binwidth

axScatter.set_xlim( (-lim, lim) )
axScatter.set_ylim( (-lim, lim) )

xText = axScatter.set_xlabel('FPR / Specificity')
yText = axScatter.set_ylabel('TPR / Sensitivity')

bins = np.arange(-lim, lim + binwidth, binwidth)
plt.show()

一切正常,除了p5是一行.

Everything works, except the p5 which is a line.

现在这应该如何工作? 这里有什么好的做法?

Now how is this supposed to work? What's good practice here?

推荐答案

plot采用y值并将x用作索引数组0..N-1或x和y值,如

plottakes either y values and uses x as index array 0..N-1 or x and y values as described in the documentation. So you could use

p5 = axScatter.plot((0, 1), "r--")

在代码中绘制线条.

但是,您要求好的做法". 以下代码(希望)显示了一些良好实践"以及matplotlib创建您在问题中提到的绘图的一些功能.

However, you are asking for "good practice". The following code (hopefully) shows some "good practise" and some of the capabilities of matplotlib to create the plot you mention in your question.

import numpy as np
import matplotlib.pyplot as plt 

# create some data
xy = np.random.rand(4, 2)
xy_line = (0, 1)

# set up figure and ax
fig, ax = plt.subplots(figsize=(8,8))

# create the scatter plots
ax.scatter(xy[:, 0], xy[:, 1], c='blue')
for point, name in zip(xy, 'ABCD'):
    ax.annotate(name, xy=point, xytext=(0, -10), textcoords='offset points',
                color='blue', ha='center', va='center')
ax.scatter([0], [1], c='black', s=60)
ax.annotate('Perfect Classification', xy=(0, 1), xytext=(0.1, 0.9),
            arrowprops=dict(arrowstyle='->'))

# create the line
ax.plot(xy_line, 'r--', label='Random guess')
ax.annotate('Better', xy=(0.3, 0.3), xytext=(0.2, 0.4),
            arrowprops=dict(arrowstyle='<-'), ha='center', va='center')
ax.annotate('Worse', xy=(0.3, 0.3), xytext=(0.4, 0.2),
            arrowprops=dict(arrowstyle='<-'), ha='center', va='center')
# add labels, legend and make it nicer
ax.set_xlabel('FPR or (1 - specificity)')
ax.set_ylabel('TPR or sensitivity')
ax.set_title('ROC Space')
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.legend()
plt.tight_layout()
plt.savefig('scatter_line.png', dpi=80)

顺便说一句:我认为matplotlibs文档现在非常有用.

By the way: I think that matplotlibs documentation is quite useful nowadays.

这篇关于如何在散点图中绘制线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆