Python 在二维直方图中的点之间绘制一条线

Python 在二维直方图中的点之间绘制一条线,python,matplotlib,plot,histogram,Python,Matplotlib,Plot,Histogram,我需要在我的分析中划出一条界限 我已经绘制了一个二维直方图,需要在这个直方图上绘制一些点,并在它们之间画一条线。我已经尝试了plt.plot(),但是点和线都没有出现在绘图中。如果我使用plt.scatter()现在点出现了,但是我仍然需要用一条线连接点 我的情节如下: 关于如何连接这些红点有什么提示吗?(我忘了说,但我只想画一些点,在本例中是200,不是全部)。我使用的代码是: import numpy as np import matplotlib.pyplot as plt from n

我需要在我的分析中划出一条界限

我已经绘制了一个二维直方图,需要在这个直方图上绘制一些点,并在它们之间画一条线。我已经尝试了
plt.plot()
,但是点和线都没有出现在绘图中。如果我使用
plt.scatter()
现在点出现了,但是我仍然需要用一条线连接点

我的情节如下:

关于如何连接这些红点有什么提示吗?(我忘了说,但我只想画一些点,在本例中是200,不是全部)。我使用的代码是:

import numpy as np
import matplotlib.pyplot as plt
from numpy import zeros,empty,array,loadtxt,dot,linspace

f = [0]
yy = [0]
jjj=0
def leapfrog(x, v, gradient, timestep, trajectory_length):
    v -= 0.5 * timestep * gradient(x)
    for _ in range(trajectory_length - 1):
        x += timestep * v
        v -= timestep * gradient(x)
    x += timestep * v
    v -= 0.5 * timestep * gradient(x)
    #f.append(x)
    
    
    
    return x, v
    
def sample_HMC(x_old, log_prob, log_prob_gradient, timestep, trajectory_length):
    # switch to physics mode!
    def E(x): return -log_prob(x)
    def gradient(x): return -log_prob_gradient(x)
    def K(v): return 0.5 * np.sum(v ** 2)
    def H(x, v): return K(v) + E(x)

    # Metropolis acceptance probability, implemented in "logarithmic space"
    # for numerical stability:
    def log_p_acc(x_new, v_new, x_old, v_old):
        return min(0, -(H(x_new, v_new) - H(x_old, v_old)))

    # give a random kick to particle by drawing its momentum from p(v)
    v_old = np.random.normal(size=x_old.shape)

    # approximately calculate position x_new and momentum v_new after
    # time trajectory_length  * timestep
    x_new, v_new = leapfrog(x_old.copy(), v_old.copy(), gradient,
                            timestep, trajectory_length)
                            
                           

    # accept / reject based on Metropolis criterion
    accept = np.log(np.random.random()) < log_p_acc(x_new, v_new, x_old, v_old)

    # we consider only the position x (meaning, we marginalize out v)
    f.append(x_new)
    #yy.append(v_new)
    if accept:       
        return accept, x_new
    else:
        return accept, x_old
        
def build_HMC_chain(init, timestep, trajectory_length, n_total, log_prob, gradient):
    n_accepted = 0
    chain = [init]

    for _ in range(n_total):
        accept, state = sample_HMC(chain[-1].copy(), log_prob, gradient,
                                   timestep, trajectory_length)
        chain.append(state)
        n_accepted += accept

    acceptance_rate = n_accepted / float(n_total)

    return chain, acceptance_rate
    
def log_prob(x): return -0.5 * np.sum(x ** 2)

def log_prob_gradient(x): return -x

chain, acceptance_rate = build_HMC_chain(np.array([5.0, 1.0]), 1.5, 10, 10000,
                                         log_prob, log_prob_gradient)
print("Acceptance rate: {:.3f}".format(acceptance_rate))

k=0
data = zeros(10001, float)
for item in chain:
    data[k] = chain[k][0]
    k=k+1
print(data)

k=0
datay = zeros(10001, float)
for item in chain:
    datay[k] = chain[k][1]
    k=k+1
print(data)

k=0
plt.hist2d(data,datay,100)
for i in range(200):
    #plt.scatter(data[i],datay[i])
    #plt.plot(data[i],datay[i])
    plt.plot(data[i],datay[i],'.r-')
#plt.ylim(-4.9,4.9)
#plt.xlim(-4.9,4.9)
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
从numpy导入零、空、数组、loadtxt、点、linspace
f=[0]
yy=[0]
jj=0
def蛙跳(x、v、梯度、时间步、轨迹长度):
v-=0.5*时间步长*梯度(x)
对于范围内的(轨迹长度-1):
x+=时间步长*v
v-=时间步长*梯度(x)
x+=时间步长*v
v-=0.5*时间步长*梯度(x)
#f、 附加(x)
返回x,v
def样本HMC(x旧、对数概率、对数概率梯度、时间步长、轨迹长度):
#切换到物理模式!
def E(x):返回-日志问题(x)
def梯度(x):返回-对数概率梯度(x)
定义K(v):返回0.5*np.和(v**2)
DEFH(x,v):返回K(v)+E(x)
#大都市接受概率,在“对数空间”中实现
#对于数值稳定性:
def log_p_acc(x_新、v_新、x_旧、v_旧):
返回最小值(0,-(H(x_新,v_新)-H(x_旧,v_旧)))
#通过从p(v)中吸取粒子的动量,给粒子一个随机的冲击
v_old=np.random.normal(大小=x_old.shape)
#大致计算位置x_new和动量v_new
#时间轨迹长度*时间步长
x_new,v_new=leapfrog(x_old.copy(),v_old.copy(),gradient,
时间步长、轨迹(单位长度)
#基于Metropolis标准的接受/拒绝
accept=np.log(np.random.random())
我不知道您在想什么,但指定plot方法的marker参数会产生由线连接的点:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(size=5000)
y = x * 1.5 + np.random.normal(size=5000)
x_p = [2,-2,-2,2]
y_p = [2,2,-2,-2]
x_p = np.append(x_p, x_p[0])
y_p = np.append(y_p, y_p[0])

plt.hist2d(x,y, bins=(50, 50))
plt.plot(x_p,y_p,marker='o')
plt.show()
至于连接顺序:只需对阵列进行排序,这些点将根据它们在阵列中的位置进行连接

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(size=50000)
y = x * 1.5 + np.random.normal(size=50000)
x_p = [2,-2,-2,2]
y_p = [2,-2,2,-2]
x_p = np.append(x_p, x_p[0])
y_p = np.append(y_p, y_p[0])

data = np.random.random((100,100))
plt.hist2d(x,y, bins=(50, 50))
plt.plot(x_p,y_p,marker='o')
plt.show()

请显示您的代码“需要在此直方图上方绘制一些点,并在它们之间画一条线”。你想用什么样的线来连接这些点?这将有助于包括一些你想画的东西,包括一些代码来重现你当前的绘图。@N.Wouda我想通过“顺序”将它们连接起来。点0连接到点1,点1到2等等。这是我想要的,但我只需要绘制一些点,实际上是前200点。但是如果我做一个循环,plt.plot(x[i],y[i],marker='o'),连接点的线不会显示在绘图中。现在我做了,我只使用了:plt.plot(data[0:200],datay[0:200],marker='o'),它工作了。谢谢