[英]Plot smoother bifurcation diagrams in Python
我正在使用matplotlib.scatter
繪制系統的分叉圖,該系統通過周期性倍增的路徑陷入混亂。 使用可以在此處找到的數據,我使用以下命令:
import numpy as np
import matplotlib.pyplot as plt
p_chi0,b_chi0=np.loadtxt('data.dat')
plt.scatter(p_chi0,b_chi0,s=0.2,marker=".")
plt.xlim([2.35,2.6])
plt.show()
我得到以下圖:
但是,您可以看到線條不平滑。 即使存在這些分歧,是否有辦法插值此類數據,而不是一一對應?
當繪制每個數據點大小恰好一個像素時,您將獲得最准確的數據表示。
import numpy as np
import matplotlib.pyplot as plt
p, b = np.loadtxt('data/bifurcation.txt')
fig, ax = plt.subplots(figsize=(8,6), dpi=100)
# Plot one pixel sizes markers
ax.plot(p,b, ls="", marker=",")
# or with scatter.
#ax.scatter(p,b, s=(72./fig.dpi)**2, marker='o', lw=0,)
ax.set_xlim([2.35, 2.6])
fig.savefig('bifurcation.png')
plt.show()
但是,這看起來一點也不流暢。 通過選擇較大的標記大小,然后增加dpi和圖形大小,您將獲得平滑的表示。 然后將圖像重新采樣到原始尺寸將使結果看起來更平滑。
此外,由於基於Agg的后端在標記標記時不准確,因此使用基於Cairo的后端將是有益的。
import matplotlib
matplotlib.use("Qt5Cairo")
import numpy as np
import matplotlib.pyplot as plt
p, b = np.loadtxt('data/bifurcation.txt')
fig, ax = plt.subplots(figsize=(8,6), dpi=300)
ax.scatter(p,b, s=(2*72./fig.dpi)**2, marker='o', lw=0)
ax.set_xlim([2.35, 2.6])
fig.savefig('bifurcation.png')
plt.show()
由於您的數據點是有序的且間隔很近,因此您要做的就是在連續的數據點之間進行線性插值。 另外,保存數字時我會增加DPI。
例如:
import numpy as np
import matplotlib.pyplot as plt
p, b = np.loadtxt('data.dat')
def upsample_linearly(x, upsample_by):
dx = np.diff(x)
xx = [x[:-1] + fraction * dx for fraction in np.linspace(0., 1., upsample_by)]
xx = np.transpose(xx).ravel()
return xx
upsampled_p = upsample_linearly(p, 5)
upsampled_b = upsample_linearly(b, 5)
fig, ax = plt.subplots(1,1)
ax.scatter(upsampled_p, upsampled_b, s=0.1, marker=".")
ax.set_xlim([2.35, 2.6])
fig.savefig('./bifurcation.png', dpi=1000)
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.