Как сделать графики matplotlib профессионально выполненными так?

Графы по умолчанию matplotlib выглядят действительно непривлекательными и даже непрофессиональными. Я пробовал пару пакетов, включая морской, а также prettyplotlib, но оба они едва улучшают стили.

До сих пор я получил следующий пакет:

enter image description here

Ниже представлен внешний вид, который я ищу, который намного выше:

enter image description here

Обратите внимание на следующую приятность во втором примере:

  • Площадь под графиком заполнена гораздо более приятным цветом.
  • Линия графика - мыслитель и красиво выделяется.
  • Линии осей являются мыслителями и снова прекрасно выделяются.
  • Область под кривой прозрачна.
  • Знаки X-Axis более плотные.

Мои вопросы: Вы признаете выше как какую-то популярную тему или стиль, который я могу быстро использовать в matplotlib? Или, если я могу использовать какой-то пакет? В противном случае, все равно, чтобы установить этот стиль в качестве моего глобального предпочтения? В противном случае, возможно ли это сделать в matlibplot?

Спасибо!

Ответ 1

Это действительно вопрос вкуса, а также вопрос целевой аудитории. matplotlib пытается дать четкие иллюстрации для научных целей. Это - обязательно - компромисс, а иллюстрации - это не то, что вы напечатаете в журнале или покажете в рекламе.

В этом смысле есть хорошие новости и некоторые плохие новости о matplotlib.

Плохая новость:

  • Нет никакой волшебной команды или пакета, которые создавали бы красивые сюжеты с matplotlib.

Хорошие новости:

  • Существуют простые способы изменения настроек по умолчанию: http://matplotlib.org/users/customizing.html
  • Объектная модель позволяет пользователю изменять почти все и вводить сложные новые функции.
  • Исходный код доступен, и даже он может быть легко изменен пользователем.

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

Как пример:

import numpy as np
import matplotlib.pyplot as plt


# create some fictive access data by hour
xdata = np.arange(25)
ydata = np.random.randint(10, 20, 25)
ydata[24] = ydata[0]

# let us make a simple graph
fig = plt.figure(figsize=[7,5])
ax = plt.subplot(111)
l = ax.fill_between(xdata, ydata)

# set the basic properties
ax.set_xlabel('Time of posting (US EST)')
ax.set_ylabel('Percentage of Frontpaged Submissions')
ax.set_title('Likelihood of Reaching the Frontpage')

# set the limits
ax.set_xlim(0, 24)
ax.set_ylim(6, 24)

# set the grid on
ax.grid('on')

(Только комментарий: пределы X-оси в исходном изображении не учитывают цикличность данных.)

Это даст нам что-то вроде этого:

enter image description here

Легко понять, что нам нужно сделать много изменений, чтобы показать это менее ориентированной на инженерство аудитории. По крайней мере:

  • сделать заливку прозрачной и менее оскорбительной по цвету
  • сделать линию более толстой
  • изменить цвет линии
  • добавить больше тиков к оси X
  • изменить шрифты названий

# change the fill into a blueish color with opacity .3
l.set_facecolors([[.5,.5,.8,.3]])

# change the edge color (bluish and transparentish) and thickness
l.set_edgecolors([[0, 0, .5, .3]])
l.set_linewidths([3])

# add more ticks
ax.set_xticks(np.arange(25))
# remove tick marks
ax.xaxis.set_tick_params(size=0)
ax.yaxis.set_tick_params(size=0)

# change the color of the top and right spines to opaque gray
ax.spines['right'].set_color((.8,.8,.8))
ax.spines['top'].set_color((.8,.8,.8))

# tweak the axis labels
xlab = ax.xaxis.get_label()
ylab = ax.yaxis.get_label()

xlab.set_style('italic')
xlab.set_size(10)
ylab.set_style('italic')
ylab.set_size(10)

# tweak the title
ttl = ax.title
ttl.set_weight('bold')

Теперь мы имеем:

enter image description here

Это не совсем так, как в вопросе, но все может быть настроено в этом направлении. Многие из заданных здесь параметров могут быть установлены как значения по умолчанию для matplotlib. Возможно, это дает представление о том, как изменить ситуацию на сюжетах.

Ответ 2

Чтобы приблизиться к стилю, который вы предпочитаете, вы можете использовать стиль whitegrid на морском побережье. Как уже отмечалось в других ответах, вы контролируете прозрачность заливки параметром alpha до fill_between.

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")

blue, = sns.color_palette("muted", 1)

x = np.arange(23)
y = np.random.randint(8, 20, 23)

fig, ax = plt.subplots()
ax.plot(x, y, color=blue, lw=3)
ax.fill_between(x, 0, y, alpha=.3)
ax.set(xlim=(0, len(x) - 1), ylim=(0, None), xticks=x)

enter image description here

Более подробную информацию о стилях морского стиля можно найти в docs.

Ответ 3

matplotlib почти бесконечно гибкая, поэтому вы можете делать с ней что угодно, и если она не существует, вы можете написать ее сами! Очевидно, что значения по умолчанию - мягкие, это потому, что у каждого есть свое представление о том, что "приятно", поэтому бессмысленно навязывать предопределенный стиль.

Вот действительно простой пример, который адресован 4 вашим точкам.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

x = np.linspace(-10, 10, 1000)
y = 1+np.sinc(x)

ax = plt.subplot(111)
ax.plot(x, y, lw=2)
ax.fill_between(x, 0, y, alpha=0.2)
ax.grid()

majorLocator   = MultipleLocator(1)
ax.xaxis.set_major_locator(majorLocator)

plt.show()

enter image description here

Если вы хотите установить значения по умолчанию, чтобы все ваши графики выглядели одинаково, вы должны создать пользовательский matplotlibrc file. Здесь полезен . Чтобы просмотреть список всех доступных параметров, просто вызовите print plt.rcParams с интерактивного терминала.

Некоторые из других функций, таких как заполнение, должны выполняться на основе сюжета. Вы можете стандартизировать это в своей работе, создав функцию, которая добавляет заполнение между заданным некоторым вводом, таким как экземпляр оси и данные.

Ответ 4

Вы можете настроить стиль графиков следующим образом:

import numpy as np
import matplotlib.pyplot as plt
plt.use_style('ggplot') # customize your plots style
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
plt.fill_between(x,y)
plt.show()