如果我没有跟踪所有进入的数据点,将y=x添加到matplotlib散点图中

ryevplcw  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(125)

下面的代码使用matplotlib对多个不同的序列进行散点图绘制,然后添加直线y=x:

import numpy as np, matplotlib.pyplot as plt, matplotlib.cm as cm, pylab

nseries = 10
colors = cm.rainbow(np.linspace(0, 1, nseries))

all_x = []
all_y = []
for i in range(nseries):
    x = np.random.random(12)+i/10.0
    y = np.random.random(12)+i/5.0
    plt.scatter(x, y, color=colors[i])
    all_x.extend(x)
    all_y.extend(y)

# Could I somehow do the next part (add identity_line) if I haven't been keeping track of all the x and y values I've seen?
identity_line = np.linspace(max(min(all_x), min(all_y)),
                            min(max(all_x), max(all_y)))
plt.plot(identity_line, identity_line, color="black", linestyle="dashed", linewidth=3.0)

plt.show()

为了实现这个目标,我必须跟踪所有进入散点图的x和y值,这样我就知道identity_line应该在哪里开始和结束。有没有一种方法可以让y=x显示出来,即使我没有所有我绘制的点的列表?我想matplotlib中的一些东西可以在事后给予我一个所有点的列表。但我还没想好怎么拿到名单

wnrlj8wa

wnrlj8wa1#

你不需要知道关于数据的任何事情,你可以通过matplotlib Axes对象来了解数据。
见下图:

import numpy as np
import matplotlib.pyplot as plt

# random data 
N = 37
x = np.random.normal(loc=3.5, scale=1.25, size=N)
y = np.random.normal(loc=3.4, scale=1.5, size=N)
c = x**2 + y**2

# now sort it just to make it look like it's related
x.sort()
y.sort()

fig, ax = plt.subplots()
ax.scatter(x, y, s=25, c=c, cmap=plt.cm.coolwarm, zorder=10)

以下是精彩部分:

lims = [
    np.min([ax.get_xlim(), ax.get_ylim()]),  # min of both axes
    np.max([ax.get_xlim(), ax.get_ylim()]),  # max of both axes
]

# now plot both limits against eachother
ax.plot(lims, lims, 'k-', alpha=0.75, zorder=0)
ax.set_aspect('equal')
ax.set_xlim(lims)
ax.set_ylim(lims)
fig.savefig('/Users/paul/Desktop/so.png', dpi=300)

就这样

gupuwyp2

gupuwyp22#

在一行中:
ax.plot([0,1],[0,1], transform=ax.transAxes)
不需要修改xlim或ylim。

h43kikqp

h43kikqp3#

如果将scalex和scaley设置为False,则可以节省一些簿记工作。这是我最近用来覆盖y=x的方法:

xpoints = ypoints = plt.xlim()
plt.plot(xpoints, ypoints, linestyle='--', color='k', lw=3, scalex=False, scaley=False)

或者如果你有一个轴

xpoints = ypoints = ax.get_xlim()
ax.plot(xpoints, ypoints, linestyle='--', color='k', lw=3, scalex=False, scaley=False)

当然,这不会给予你一个正方形的长宽比。如果你关心这个,就用Paul H的解决方案。

qvsjd97n

qvsjd97n4#

从matplotlib 3.3开始,使用axline方法可以非常简单地绘制x=y,该方法只需要一个点和一个斜率。

ax.axline((0, 0), slope=1)

您不需要查看数据就可以使用它,因为您指定的点(即此处的(0,0))实际上不需要在数据或绘图范围内。

相关问题