2016-09-05 2 views
0

У меня есть матрица H, которая может принимать 3 направленных аргумента. Я хочу построить собственные значения (просто подумайте об этом как функции) с одним набором аргументов & рядом с ним - все еще на одном графике - функцией с другим набором аргументов. Это очень часто используется в физике, т. Е. При построении полосовых структур. Это выглядит следующим образом:запишите fuction в том же графе с разными аргументами рядом друг с другом

enter image description here

Это не просто меняется от 0 до гамма- и 2pi (постоянная решетки = 1) в X, но на самом деле делать mutlipleplots рядом друг с другом на одном участке.

Edit:

У меня нет измеряемых данных -> это все вычисленных. У меня есть np.matrix (гамильтониан - 8x8), который зависит от 7 аргументов, единственные, которые я меняю здесь, - это направления. г = Gamma, X, ... являются позиции (я знаю, что направления их.) Каждый участок генерируется так:

fig4=plt.figure() 
LG=fig4.add_subplot(111) 
for val in np.linspace(-np.pi/a, 0, 1000): 
    LG.scatter([val]*8, H(val, val , val, -15.2, -s*10.25, 19.60, -5.30)) 
plt.grid() 
plt.title(r"$L-\Gamma$") 
plt.xlabel(r"$k$ in high symmetry points") 
plt.xticks([-C*0.5, 0.], ["L", "$\Gamma$"]) 
plt.ylabel("energy/eV") 
plt.show() 

Я включил физику, так что врачи понимают, что проще. В случае, если их здесь не так много:

У меня есть функция plot1 и plot2 & Я хочу добавить график2 горизонтально в один граф с одинаковыми y-осями, но с разными x-осями. Как на картинке (из g-X - одна функция, от X до W другая и т. Д.).

Редакция 2: Ответ TobyD & pathoren позволил построить функцию w/несколько аргументов рядом с каждым аргументом w/free. Я думаю, что моя проблема в принципе разрешима этим, но поскольку у меня нет функций, а есть матрица и вы хотите вычислить собственные значения и иметь более одного аргумента, это сложно. Мне удается создать сюжет, который я хочу разрезать только горизонтально (но не как краска, а с одним описанием оси x).

Редактировать3: Спасибо pathoren & TobyD за вашу помощь. Самый простой способ состоял в том, чтобы просто изменить аргумент x + что-то, x-что-то, теперь у меня больше, чем способ, который в конечном итоге может быть полезен.

final answer

+0

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

+0

Перейдите в [галерея] (http://matplotlib.org/gallery.html#) и оглядитесь, пока вы не увидите картинку, которая выглядит так близко к тому, что вы хотите сделать, а затем посмотрите на ее код, чтобы посмотреть, как они это сделали. Как [plot_fivethirtyeight] (http://matplotlib.org/gallery.html#style_sheets) – wwii

ответ

1

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

Попробуйте что-то вроде этого:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

fig = plt.figure() 
gs = gridspec.GridSpec(1,n, width_ratios = [width_1,...,width_n]) 
axes = [plt.subplot(subplot) for subplot in gs] 
fig.subplots_adjust(wspace=0) 

Где п число отличаясь аргумент устанавливает вы хотите быть черчения и width_n ширина каждого в любой единицы вы выбираете на основе вашей нормализации.

Subplots_adjust устанавливает пространство между подзаголовками на 0. GridSpec дает вам более тонкий контроль над размерами каждого из них. Флаг sharey не работает с gridspec, поэтому нам приходится возиться с y-ticks вручную.

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

Используя тот же пример, как @pathoren:

def f(x, a, b, c): 
    return a*x**2 + b*x + c 

fig = plt.figure() 
gs = gridspec.GridSpec(1, 3, width_ratios = [3, 2, 1]) 
axes = [plt.subplot(subplot) for subplot in gs] 
fig.subplots_adjust(wspace=0) 

x = np.linspace(0, 10, 100) 
y = np.linspace(2, 5 ,100) 
z = np.linspace(0, 2*np.pi, 100) 

f1 = f(x, 1, 2, 3) 
f2 = f(y, 3, -2, 0) 
f3 = f(z, -1, 2, 1) 

axes[0].plot(x, f1, label='f1') 
axes[0].set_xticks([0, 10]) 
axes[0].set_xticklabels(["L", "X"]) 
axes[0].yaxis.tick_left()  

axes[1].plot(y, f2, label='f2') 
axes[1].set_xticks([5]) 
axes[1].set_xticklabels(["G"]) 
axes[1].yaxis.set_tick_params(size=0) 
plt.setp(axes[1].get_yticklabels(), visible=False) 

axes[2].plot(z, f3, label='f3') 
axes[2].set_xticks([2*np.pi]) 
axes[2].set_xticklabels(["Y"]) 
axes[2].yaxis.tick_right()  
axes[2].set_xlim([z[0],z[-1]]) 
plt.setp(axes[2].get_yticklabels(), visible=False) 

plt.show() 

Обратите внимание, что функции для изменения атрибутов сюжетных как xticks немного отличается. Использование axes[2].set_xlim гарантирует, что последний график отлично отладится.

Example Graph

+0

Да, я имел в виду так: значения x могут перекрываться. Кроме того, я хотел бы задать область для каждой части на оси x самостоятельно. то есть: от K = 10 до L = 20, составляет 5 единиц, от L = 20 до M = 50 - 3 единицы на диаграмме патогенов. (K, L, M на самом деле являются координатами 3D-объектов, а длина должна определяться как норма вектора связи, а не длина в одном направлении) – Carsten

+0

@ Карстен Я обновил свой андерсер, чтобы уточнить ширина – TobyD

-1

Ниже приведен сценарий, где функция f принимает 3 параметра a, b, c. Значения x разбиты на три разных режима: x1, x2, x3 с соответствующими значениями функций f1, f2, f3. На некоторых контрольных точках (задано x_ticks) нарисованы линии, а стрелки показаны только для этих точек. Xlabels устанавливаются x_ticklabels, только на x_ticks -позиции.

import numpy as np 
import matplotlib.pyplot as plt 

def f(x, a, b, c): 
    return a*x**2 + b*x + c 

x1 = np.linspace(0, 10, 100) 
f1 = f(x1, 1, 2, 3) 
x2 = np.linspace(10, 20, 100) 
f2 = f(x2, 3, -2, 0) 
x3 = np.linspace(20, 50, 100) 
f3 = f(x3, -1, 2, 1) 

fig, ax = plt.subplots(1, 1) 

ax.plot(x1, f1, label='f1') 
ax.plot(x2, f2, label='f2') 
ax.plot(x3, f3, label='f3') 
x_ticks = [10, 20, 50] 
x_ticklabels = ['K', 'L', 'M'] 
ax.vlines(x_ticks, ax.get_ylim()[0], ax.get_ylim()[1]) 
ax.set_xticks(x_ticks) 
ax.set_xticklabels(x_ticklabels) 
ax.set_yticks([]) 

plt.show() 

enter image description here

+0

И теперь я хочу, чтобы эти 3 функции были на одном графике, но рядом друг с другом, где ось y осталась неизменной, но ось x свободно выбирается. Как f1 (x, 1, 2, 3) с 0 Carsten

+0

Я обновил свой ответ. Это работает для вас? – pathoren

Смежные вопросы