Как я могу сделать все точки на плотном графике видимыми в matplotlib? - PullRequest
2 голосов
/ 28 мая 2020

Я использую этот код basi c для отображения графика с помощью matplotlib. Списки для осей x и y большие.

plt.plot(r,trajectory,"k.")
plt.title("Bifurcation diagram")
plt.xlabel("R")
plt.ylabel("Xn")
plt.show()

Как мне лучше отформатировать график, чтобы увидеть все детали?

С приведенной выше конфигурацией я вижу:

Initial

Но я хочу получить то, что выглядит примерно так с каждым точка видна (по крайней мере, достаточно высокое разрешение для увеличения)

final

Обновление: я обнаружил, что итеративная настройка доступных параметров может дать хорошие результаты. Для понимания параметров и получения этой конфигурации использовалась комбинация приведенных ниже ответов.

f = plt.figure(figsize=(6,4),dpi=300)
plt.plot(r, trajectory, "k,", markersize=0.01, mew=0)
f.savefig("bifurcation_diag.png")
plt.title("Bifurcation diagram")
plt.xlabel("R")
plt.ylabel("Xn")
plt.show()

Output

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Вы можете использовать маркер меньшего размера . Проблема в том, что существует так много точек данных, что они перекрываются, что приводит к темному изображению.

Я объясняю это ниже на примере набора данных. На левом рисунке показан размер маркера по умолчанию, а на правом рисунке показаны те же данные с меньшим размером маркера с использованием аргумента ms=1. Вы можете выбрать ms=2, ms=3 и c. в соответствии с вашими потребностями.

import numpy as np

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

# Default marker size
ax1.plot(np.random.randint(0, 100, 10000), np.random.randint(0, 100, 10000), 'k.')

# Smaller marker size `ms=1`
ax2.plot(np.random.randint(0, 100, 10000), np.random.randint(0, 100, 10000), 'k.', ms=1)

enter image description here

1 голос
/ 28 мая 2020

В качестве маркера вам нужна запятая, а не точка. Маркер запятой составляет всего один пиксель, а точка - это одна «точка». Установите mew=0, чтобы контур не рисовался, так как контур будет намного больше пикселя. Вы также можете добавить alpha=0.2 (или аналогичный), чтобы получить полупрозрачные пиксели.

Вот как это может выглядеть:

plt.plot(r, trajectory, 'b,', markersize=.1, mew=0, alpha=0.2)

example plot

PS: Полный код для воспроизведения сюжета:

import numpy as np
from matplotlib import pyplot as plt

def logistic_map(x0, r, num_iter):
    x = np.zeros(num_iter)
    xi = x0
    for i in range(num_iter):
        xi = r * xi * (1 - xi)
        x[i] = xi
    return x

def bifurcations(x0, r_min, r_max, r_steps, num_iter, iter_to_skip):
    r_values = np.linspace(r_min, r_max, r_steps)
    bifurcations = [logistic_map(x0, r, num_iter)[iter_to_skip:] for r in r_values]
    plt.plot(r_values, bifurcations, "b,", markersize=.1, mew=0, alpha=0.2)
    plt.show()

bifurcations(0.1, 2.4, 4, 500, 1000, 5)

Настройка alpha=0.1 и bifurcations(0.1, 2.4, 4, 2000, 2000, 500):

more detailed plot

0 голосов
/ 28 мая 2020

Думаю, такой результат можно получить, установив прозрачность сюжета. Попробуйте это:

#just add alpha to your plt.plot() method
plt.plot(r,trajectory,"k.", alpha=0.2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...