Как сделать графики 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()