我非常喜欢The Logistic Map' Period Doubling Bifurcation,并希望将它打印在画布上。
我可以在python中创建绘图,但是需要一些帮助来准备图形属性,以便它具有合适的分辨率来打印。我的代码权利产生了一些锯齿状的线条。
这是我的代码:
将numpy导入为np 将matplotlib.pyplot导入为plt
# overall image properties
width, height, dpi = 2560, 1440, 96
picture_background = 'white'
aspect_ratio = width / height
plt.close('all')
R = np.linspace(3.5,4,5001)
fig = plt.figure(figsize=(width / dpi, height / dpi), frameon=False)
ylim = -0.1,1.1
ax = plt.Axes(fig, [0, 0, 1, 1], xlim = (3.4,4))
ax.set_axis_off()
fig.add_axes(ax)
for r in R:
x = np.zeros(5001)
x[0] = 0.1
for i in range(1,len(x)):
x[i] = r*x[i-1]*(1-x[i-1])
ax.plot(r*np.ones(2500),x[-2500:],marker = '.', markersize= 0.01,color = 'grey', linestyle = 'none')
plt.show()
plt.savefig('figure.eps', dpi=dpi, bbox_inches=0, pad_inches=0, facecolor=picture_background)
以下是代码产生的内容:
正如你所看到的,情节最左边的一些线条是锯齿状的。
如何创建此图,以便分辨率适合在各种框架尺寸上打印?
答案 0 :(得分:1)
我认为jaggies的来源是基础像素大小+,你使用非常小的'点'标记来绘制它。线路经过的像素已经完全饱和,因此您可以获得“锯齿”。
绘制这些数据的更好方法是提前进行分箱,然后让mpl绘制热图:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
plt.ion()
width, height, dpi = 2560 / 2, 1440 / 2, 96 # cut to so SO will let me upload result
aspect_ratio = width / height
fig, ax = plt.subplots(figsize=(width / dpi, height / dpi), frameon=False,
tight_layout=True)
ylim = -0.1, 1.1
ax.axis('off')
# make heatmap at double resolution
accumulator = np.zeros((height, width), dtype=np.uint64)
burn_in_count = 25000
N = 25000
R = np.linspace(3.5, 4, width)
x = 0.1 * np.ones_like(R)
row_indx = np.arange(len(R), dtype='uint')
# do all of the r values in parallel
for j in range(burn_in_count):
x = R * x * (1 - x)
for j in range(N):
x = R * x * (1 - x)
col_indx = (height * x).astype('int')
accumulator[col_indx, row_indx] += 1
im = ax.imshow(accumulator, cmap='gray_r',
norm=mcolors.LogNorm(), interpolation='none')
请注意,如果您只想查看点击的像素,则会进行对数缩放
使用
im = ax.imshow(accumulator>0, cmap='gray_r', interpolation='nearest')
但是这些仍然存在锯齿问题和(可能更糟)有时候窄线会出现混淆。
这是datashader或rasterized scatter旨在通过以智能方式(see this PR for a prototype datashader/mpl integartion)在绘制时重新分组数据来解决的问题。这两个仍然是原型/概念验证,但可以使用。
重新计算Mandelbrot设置缩放的http://matplotlib.org/examples/event_handling/viewlims.html也可能对您感兴趣。