python - 在二维直方图中的点之间画一条线
问题描述
我需要在分析中的点之间画一条线。
我已经绘制了一个 2D 直方图,并且需要绘制一些覆盖该直方图的点并在它们之间画一条线。我已经尝试过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()
解决方案
我不知道你在想什么,但指定 plot 方法的标记参数会产生由线连接的点:
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()
推荐阅读
- python-3.x - pep8 合规性测试失败
- python - 如何在其他 .py 文件中使用变量
- javascript - Ammo.js Three.js - 计算投篮所需的力矢量
- python - 使用 pd.merge 合并多个电子表格
- installation - 除了 MAMP 之外,还需要 Apache 和 MySQL 服务器吗?
- javascript - Google Apps 脚本返回错误的时区
- javascript - 将 Vue 查询参数从当前路由传递到 router-link
- php - Lumen 8 不使用 .env.testing
- python - pandas rolling std 如何计算?
- android - 从 URI 下载图像并将其存储在文件夹中