如何创建具有最佳打印分辨率的图形?

时间:2016-09-03 22:15:55

标签: python matplotlib figure

我非常喜欢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)

以下是代码产生的内容:

enter image description here

正如你所看到的,情节最左边的一些线条是锯齿状的。

如何创建此图,以便分辨率适合在各种框架尺寸上打印?

1 个答案:

答案 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')

log scaled logistic map

请注意,如果您只想查看点击的像素,则会进行对数缩放

使用

im = ax.imshow(accumulator>0, cmap='gray_r', interpolation='nearest')

logistic map 'hits'

但是这些仍然存在锯齿问题和(可能更糟)有时候窄线会出现混淆。

这是datashaderrasterized scatter旨在通过以智能方式(see this PR for a prototype datashader/mpl integartion)在绘制时重新分组数据来解决的问题。这两个仍然是原型/概念验证,但可以使用。

重新计算Mandelbrot设置缩放的

http://matplotlib.org/examples/event_handling/viewlims.html也可能对您感兴趣。