Построить более гладкие бифуркационные диаграммы в Python - PullRequest
0 голосов
/ 12 ноября 2018

Я использую 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()

Я получаю следующий график:

enter image description here

Однако, как вы можете видеть, линии не являются гладкими.Есть ли способ интерполировать этот тип данных, даже если эти бифуркации существуют, таким образом, что это не однозначное соответствие?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы получите самое точное точное представление данных при построении каждой точки данных размером ровно в один пиксель.

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()

enter image description here

Это, однако, выглядит не совсем гладко.Вы получите сглаженное представление, выбрав больший размер маркера, но затем увеличивая dpi и размер фигуры.Затем повторная выборка изображения до исходных размеров сделает результат более гладким.

Также было бы полезно использовать бэкэнд на основе Каира, поскольку бэкэнды на основе Agg не были точны при штамповке маркеров.

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()

enter image description here

0 голосов
/ 13 ноября 2018

enter image description here

Поскольку ваши точки данных упорядочены и расположены близко друг к другу, все, что вам нужно сделать, это линейно интерполировать между последовательными точками данных.Также я бы увеличил 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()
...