7 шагов, которые помогут сделать ваши столбчатые диаграммы Matplotlib красивыми
Столбчатые диаграммы можно легко создавать в matplotlib. Однако matplotlib часто рассматривают как библиотеку, которая создаёт неинтересные диаграммы и с которой может быть сложно работать.
Но проявив настойчивость и желание, мы можем создавать отличительные, эстетически приятные и информативные диаграммы.
В этой статье мы рассмотрим, как можно отказаться от такой скучной фигуры, как эта:
Подготовка графиков в MatLab
В написании научных статей немалую часть времени занимает подготовка иллюстраций, графиков и диаграмм. Хочу поделиться некоторыми мыслями и примерами того, как можно ускорить этот процесс. Материал пригодиться тем, кто пользуется системой MatLab.
MatLab предоставляет широкие возможности по отображению графической информации в виде графиков, диаграмм, и т.п. Однако не всегда получаемые по умолчанию иллюстрации удовлетворяют требованиям оформления статей. Для этого в системе MatLab существует множество настроек. И чтобы ускорить подготовку иллюстраций предлагаю воспользоваться несколькими строчками кода, которые помогут помочь настроить отображение графиков.
Прежде всего, необходимо настроить шрифты, которые будут использоваться для вывода значений осей и надписей на графиках, что также помогает в случаях неправильного отображения надписей на русском языке:
set(0,'DefaultAxesFontSize',14,'DefaultAxesFontName','Times New Roman'); set(0,'DefaultTextFontSize',14,'DefaultTextFontName','Times New Roman');
Затем необходимо настроить размер графика и его положение на экране, например, с отображением на весь экран:
figure('Units', 'normalized', 'OuterPosition', [0 0 1 1]);
При необходимости вставляем название графика:
title('Название');
Далее можно включить построение нескольких графиков в одном окне, c использованием тех же осей и свойств графика:
hold on;%или hold all;
Строим графики с определенным цветом, стилем и толщиной линии:
plot(X2,Y2,':k','LineWidth',3); plot(X2,Y3,':b','LineWidth',3); plot(X2,Y4,'-.','Color',[.1 .7 .7],'LineWidth',3); plot(X2,Y5,'--','Color',[.1 .4 .1],'LineWidth',3); plot(X2,Y6,'r','LineWidth',3);
Вставляем легенду в график с определенным положением на рисунке, например справа внизу:
legend('исходные данные','полином 3-й степени','полином 4-й степени','полином 5-й степени','полином 7-й степени','полином 9-й степени', 4);
И вот тут начинается самое интересное.
При построении графика в MatLab дробные значения подписей на осях координат отображаются с разделителем в виде точки, тогда как, разделитель дробной и целой части у нас принято отображать запятой.
Чтобы не изменять вручную все значения подписей данных осей через меню графика,
воспользуемся небольшим куском кода:
BX=get(gca,'XTick'); BY=get(gca,'YTick'); xlabel(XL,'Position',[BX(size(BX,2)) BY(1)]) ylabel(YL,'Rotation',0,'Position',[BX(1) BY(size(BY,2))]) XA=get(gca,'XTickLabel');% for i=1:size(XA,1) z=rem(i,2); if z==0; if XA(i,1)~='0' && XA(i,2)~=0 XA(i,:)=char(0); end end end XA(size(XA,1),:)=char(0); set(gca,'XTickLabel',XA); YA=get(gca,'YTickLabel');% for i=1:size(YA,1) z=strfind(YA(i,:),'.'); YA(i,z)=','; clear z; z=rem(i,2); if z~=0; YA(i,:)=char(0); end end YA(size(YA,1),:)=char(0); set(gca,'YTickLabel',YA);
Код «прореживает» подписи осей x и y, а также исправляет точки на запятые в подписях на оси y. Для других осей необходимо повторить аналогичные процедуры.
И в заключении отобразим линии координатной сетки:
grid on;
Для удобства использования, чтобы не повторять каждый раз эти действия, заключаем написанный код в функцию, в параметрах которой указываются настройки отображения графиков и их данные.
Функция subgraphic
function result=subgraphic(X1,X2,Y1,Y2,Y3,Y4,Y5,Y6,Tit,TL,XL,YL,PL) figure('Units', 'normalized', 'OuterPosition', [0 0 1 1]); plot(X1,Y1,'o','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor',[.49 1 .63],'MarkerSize',5); if Tit title(TL); end hold on; plot(X2,Y2,':k','LineWidth',3); plot(X2,Y3,':b','LineWidth',3); plot(X2,Y4,'-.','Color',[.1 .7 .7],'LineWidth',3); plot(X2,Y5,'--','Color',[.1 .4 .1],'LineWidth',3); plot(X2,Y6,'r','LineWidth',3); legend('исходные данные','полином 3-й степени','полином 4-й степени','полином 5-й степени','полином 7-й степени','полином 9-й степени', PL); BX=get(gca,'XTick'); BY=get(gca,'YTick'); xlabel(XL,'Position',[BX(size(BX,2)) BY(1)]) ylabel(YL,'Rotation',0,'Position',[BX(1) BY(size(BY,2))]) XA=get(gca,'XTickLabel');% for i=1:size(XA,1) z=rem(i,2); if z==0; if XA(i,1)~='0' && XA(i,2)~=0 XA(i,:)=char(0); end end end XA(size(XA,1),:)=char(0); set(gca,'XTickLabel',XA); YA=get(gca,'YTickLabel');% for i=1:size(YA,1) z=strfind(YA(i,:),'.'); YA(i,z)=','; clear z; z=rem(i,2); if z~=0; YA(i,:)=char(0); end end YA(size(YA,1),:)=char(0); set(gca,'YTickLabel',YA); grid on; result=1;
subgraphic(B,T,A,Y3,Y4,Y5,Y7,Dva_theta_0_5,Tit,'Название','<\itT>, \circC','<2<\phi>_, град.',3);
с заранее подготовленными данными.
И здесь нас ждет небольшая засада.
В результате получаем вот такой график:

По умолчанию MatLab отображает греческую букву «фи» как в кириллице «ф». Одним из способов отобразить привычную греческую букву «фи» с петлеобразным начертанием, является выбор специального шрифта c греческими буквами. Скачиваем, например, шрифт Greek Normal отсюда и устанавливаем. Просмотрев шрифт Greek в таблице символов, замечаем, что в этом шрифте буква «фи» существует в двух вариантах, причем для кода латинской «f» получим тот же результат что и в MatLab в виде «ф», а для кода латинской «j» должен быть получен требуемый результат.
subgraphic(B,T,A,Y3,Y4,Y5,Y7,Dva_theta_0_5,Tit,'Название','<\itT>, \circC','j>_, град.',3);
И получим вот такой график:
В результате использования приведенного кода для построения графиков с помощью системы MatLab удалось:
- Решить проблему с некорректным отображением кириллических шрифтов;
- Автоматически заменить разделитель целой и дробной части числа с точки на запятую в графике;
- Отобразить греческую букву фи в петлеобразном начертании.
UPD Еще один способ, подсказанный в комментариях, для отображения «фи» с петлеобразным начертанием:
text(x, y, '$\varphi$', 'FontSize', 14, 'Interpreter', 'latex');
- matlab
- графики
- диаграммы
- региональные настройки
- разделитель целой и дробной части
Как построить график в матлабе по точкам

Есть две координаты х и у.нужно построить точки, затем эти точки соединить в график.
Добавлено через 11 минут
в матлабе
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как построить график по точкам
Забыл. Давно пользовался MathCad . Как построить график чтобы получился как на скриншоте. Ну.
Как построить график по точкам
Подскажите как можно построить график? M = trbMashtab.Value ‘М — масштаб .
Как построить график по строго по точкам
Есть массивы координат точек первый: х у 45,58 0,5 17,86 0,49 3,821 0,485.
Как построить двумерный график по точкам, но по 3 осям
Добрый вечер. Возникла ситуация как построить в матлабе двумерный график по точкам, но по 3 осям.
461 / 451 / 56
Регистрация: 28.05.2013
Сообщений: 699
Пускай есть какие-то точки заданные их координатами (x1,y1), (х2,y2), (х3,y3) и т.д.
запишем их координаты в 2 вектора:
x=[x1,x2,x3, . ];
y=[y1,y2,y3, . ];
затем построим график с точками соединёнными линиями:
plot(x,y,’.-‘)
454 / 280 / 13
Регистрация: 13.11.2012
Сообщений: 588
Записей в блоге: 1
читай описание функции plot
1 2 3
x=[1 2 3 4]; y=[1 4 6 9]; plot(x,y,'o-');
Регистрация: 16.01.2013
Сообщений: 36
у меня есть окно интерфейса.там нужно вручную вводить значения x и y.куда нужно будет вставить этот код и как он будет выглядеть?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
function varargout = lab333(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, . 'gui_Singleton', gui_Singleton, . 'gui_OpeningFcn', @lab333_OpeningFcn, . 'gui_OutputFcn', @lab333_OutputFcn, . 'gui_LayoutFcn', [] , . 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function lab333_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = lab333_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function pushbutton1_Callback(hObject, eventdata, handles) function Im_Callback(hObject, eventdata, handles) function Im_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function Real_Callback(hObject, eventdata, handles) function Real_CreateFcn(hObject, eventdata, handles)
Рисуем гистограммы, столбчатые и круговые диаграммы
На этом занятии мы продолжим знакомство с разными типами двумерных графиков и увидим, как можно строить столбчатые и круговые диаграммы.
Гистограмма и столбчатые диаграммы
Иногда данные требуется сгруппировать по определенным диапазонам и подсчитать сколько значений попадает в тот или иной интервал. Для выполнения такой задачи хорошо подходят столбчатые диаграммы и довольно известный их вид – это гистограмма распределения случайной величины.
Давайте сгенерируем вектор из 500 случайных величин и выведем их в виде гистограммы, используя функцию hist():
import numpy as np import matplotlib.pyplot as plt fig = plt.figure(figsize=(6, 4)) ax = fig.add_subplot() y = np.random.normal(0, 2, 500) ax.hist(y) ax.grid() plt.show()
На выходе получим следующее изображение распределения нормальной СВ:

Фактически, мы здесь имеем набор столбиков, высота которых определяется числом СВ, попавших в тот или иной диапазон. Причем, по умолчанию функция hist() разбивает весь интервал на равных 10 диапазонов. Если требуется изменить это число, то мы можем его указать вторым параметром:
ax.hist(y, 50)

Прежний интервал теперь разбит на 50 диапазонов, столбиков стало больше и они выглядят тоньше.
Функции bar() и barh()
Похожий график можно сформировать и с помощью функции bar. Ей на вход, в самом простом варианте, нужно передать список отметок для столбцов x и значения высот каждого столбца y:
x = [f'H' for i in range(10)] y = np.random.randint(1, 5, len(x)) ax.bar(x, y)

Или, можно отобразить то же распределение нормальной СВ с помощью такой столбчатой диаграммы. Сначала сформируем сами величины и разобьем весь интервал на 10 равных диапазонов:
y = np.random.normal(0, 2, 500) x = np.linspace(np.min(y), np.max(y), 10)
Затем, подсчитаем, сколько величин попало в соответствующий диапазон и выведем список bars с помощью функции bar():
bars = [len(y[np.bitwise_and(y >= x[i], y x[i+1])]) for i in range(len(x)-1)] ax.bar(range(len(x)-1), bars)

Как видите, у нас получилось изображение аналогичное гистограмме. Только пришлось предварительно подготовить данные, что не очень удобно. Поэтому, когда нужно вывести распределение величин по диапазонам, то проще использовать функцию hist().
Если нам нужно отображать столбики относительно оси ординат, то для этого существует функция barh(), которая работает аналогично функции bar():
ax.barh(range(len(x)-1), bars)
В итоге, график будет выглядеть, следующим образом:

Функции bar() и barh() содержат ряд полезных параметров: