【问题标题】:Matplotlib - PDF and PNG have diferent line widthMatplotlib - PDF 和 PNG 有不同的线宽
【发布时间】:2021-06-25 06:10:27
【问题描述】:

将绘图另存为 PDF 时遇到问题。如下图所示,图中的线条比 PNG 中的线条粗得多。我该如何解决?

我不知道我是否不能在这里放置 PDF,所以我拍了一个打印屏幕,对质量感到抱歉。

我使用的代码是这样的:

import numpy as np
import matplotlib.pyplot as plt
from numpy import zeros
import math
from math import sqrt,pi,e
plt.rcParams['figure.figsize'] = [10, 6]
np.random.seed(42)

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)

    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)
    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)     #original nsteps = 10000, time step = 1.5, trajactory lenth = 10
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)

"""
Here let's make the plot for 10000 steps, time step = 1.5 e trajectory length = 10
"""

#PLOTANDO A FUNÇÃO PROB
x = zeros(10000, float)
y = zeros(10000, float)
h = 2*6.2/(10000)
for i in range(10000):
    x[i] = -5.9 + h*i
    y[i] = (1.0/sqrt(2*pi))*e**(-(h*i-5.9)**2/2)




    
"""
Here let's make the plot for 100000 steps, time step = 1.5 e trajectory length = 10
"""    
chain, acceptance_rate = build_HMC_chain(np.array([5.0, 1.0]), 1.5, 10, 100000,
                                         log_prob, log_prob_gradient)     #original nsteps = 10000, time step = 1.5, trajactory lenth = 10
print("Acceptance rate: {:.3f}".format(acceptance_rate))

k=0
data2 = zeros(100001, float)
for item in chain:
    data2[k] = chain[k][0]
    k=k+1

   
   
"""
Comparando o sampling com 10k e 100k
"""    
   
"""
pesos para 100k   
"""    
   
        
    
    
fig = plt.figure()

fig.set_size_inches(10, 5)

# Adds subplot on position 1
ax = fig.add_subplot(121)
# Adds subplot on position 2
ax2 = fig.add_subplot(122)


weights = np.ones_like(datay) / len(datay)
ax.hist(data[500:],46 ,weights=weights[500:],label="MCMC samples",density=True,facecolor='blue', alpha=0.5, ec='black')
ax.plot(x,y, label = "true distribution")
weights2 = np.ones_like(data2) / len(data2)
ax2.hist(data2[500:],46 ,weights=weights2[500:],label="MCMC samples",density=True,facecolor='blue', alpha=0.5, ec='black')
ax2.plot(x,y, label = "true distribution")
#plt.plot(log_prob)
fig.text(0.5, 0.02, 'Variable x', ha='center', size = 16)
fig.text(0.05, 0.5, 'Probability', va='center', rotation='vertical',size = 16)
ax.legend(fontsize=8)
ax2.legend(fontsize=8)
plt.savefig('hmcgausscomp.pdf') 
plt.show()    
    
    
#side by side 2d histograms

plt.set_cmap('magma')


fig = plt.figure()

fig.set_size_inches(10, 5)

# Adds subplot on position 1
ax = fig.add_subplot(121,aspect='equal')
# Adds subplot on position 2
ax2 = fig.add_subplot(122, aspect='equal')

ax.hist2d(data,datay,bins=(100,100), rasterized=True,range=np.array([(-5.9, 5.9), (-5.9, 5.9)]))
ax2.hist2d(data,datay,bins=(100,100), rasterized=True,range=np.array([(-5.9, 5.9), (-5.9, 5.9)]))
ax2.plot(data[0:200],datay[0:200],marker='.',linewidth=0.1, color = 'white')
#plt.suptitle("Distribution Of Parameters", fontsize=20)
fig.text(0.5, 0.02, 'Generalized Coordinate', ha='center', size = 16)
fig.text(0.07, 0.5, 'Generalized Momenta', va='center', rotation='vertical',size = 16)
#plt.colorbar()
plt.savefig('2DHMCpog.pdf') 
plt.savefig('2DHMCpog.png') 
plt.show() 

所以我将不胜感激任何帮助!感谢您的关注。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您是否尝试使用其他分辨率保存图像,例如使用dpi=600 作为fig.savefig 中的参数?

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 2021-11-30
      • 2019-05-29
      • 1970-01-01
      • 2021-10-15
      • 2018-08-24
      • 2015-03-27
      相关资源
      最近更新 更多