在同一个图中绘制一个函数,不同的参数彼此相邻
plot a fuction in the same graph with different arguments next to each other
我有一个矩阵 H,它可以接受 3 个方向参数。我想用一组参数绘制特征值(只需将其视为函数)并在它旁边 - 仍然在同一个图中 - 具有另一组参数的函数。
这在物理学中经常使用,即在绘制能带结构时。
看起来像:
这不仅仅是将 0 更改为 Gamma 和将 2pi(晶格常数 =1)更改为 X,而是真正在一个绘图中并排绘制多个绘图。
编辑:
我没有实测数据-->这都是计算出来的。我有一个 np.matrix(Hamiltonian - 8x8)取决于 7 个参数,我在这里唯一改变的是方向。
g=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,我想在一个具有相同 y 轴但不同 x 轴的图形中水平附加 plot2。如图(从g-X是一个函数,从X到W是另一个函数等等)。
Edit2:TobyD 和 pathoren 的回答使得在每个带有自由参数的旁边绘制一个带有多个参数的函数成为可能。
我认为我的问题原则上可以由此解决,但由于我没有函数而是一个矩阵并且想要计算特征值并且有多个方向参数所以它很复杂。我设法制作了一个我只想水平切割在一起的图(但不像油漆,但有一个 x 轴描述)。
Edit3:感谢 pathoren 和 TobyD 的帮助。最简单的方法就是改变参数 x+something,x-something,现在我有更多的方法,最终可以证明是有用的。
final answer
下面是一个脚本,其中函数 f
采用 3 个参数 a, b, c
。 x 值分为三个不同的区域 x1, x2, x3
,具有相应的函数值 f1, f2, f3
。在某些断点(由 x_ticks
定义)处绘制了线条,并且仅显示这些点的 xticks。 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()
让我看看我是否正确理解了您的意思。
尝试这样的事情:
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)
其中 n 是您要绘制的不同参数集的数量,width_n 是每个参数集的宽度,您根据标准化选择的任何单位。
subplots_adjust 将子图之间的 space 设置为 0。GridSpec 使您可以更精细地控制每个子图的大小。 sharey
标志不适用于 gridspec,因此我们必须 fiddle 手动设置 y 刻度。
然后您可以绘制每个参数集的函数,在轴的元素中,具有您想要的任何范围。基本上将轴的每个元素视为您希望连接在一起的图形之一。
使用与@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
确保最后一张图很好地切断。
我有一个矩阵 H,它可以接受 3 个方向参数。我想用一组参数绘制特征值(只需将其视为函数)并在它旁边 - 仍然在同一个图中 - 具有另一组参数的函数。 这在物理学中经常使用,即在绘制能带结构时。 看起来像:
这不仅仅是将 0 更改为 Gamma 和将 2pi(晶格常数 =1)更改为 X,而是真正在一个绘图中并排绘制多个绘图。
编辑:
我没有实测数据-->这都是计算出来的。我有一个 np.matrix(Hamiltonian - 8x8)取决于 7 个参数,我在这里唯一改变的是方向。 g=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,我想在一个具有相同 y 轴但不同 x 轴的图形中水平附加 plot2。如图(从g-X是一个函数,从X到W是另一个函数等等)。
Edit2:TobyD 和 pathoren 的回答使得在每个带有自由参数的旁边绘制一个带有多个参数的函数成为可能。 我认为我的问题原则上可以由此解决,但由于我没有函数而是一个矩阵并且想要计算特征值并且有多个方向参数所以它很复杂。我设法制作了一个我只想水平切割在一起的图(但不像油漆,但有一个 x 轴描述)。
Edit3:感谢 pathoren 和 TobyD 的帮助。最简单的方法就是改变参数 x+something,x-something,现在我有更多的方法,最终可以证明是有用的。
final answer
下面是一个脚本,其中函数 f
采用 3 个参数 a, b, c
。 x 值分为三个不同的区域 x1, x2, x3
,具有相应的函数值 f1, f2, f3
。在某些断点(由 x_ticks
定义)处绘制了线条,并且仅显示这些点的 xticks。 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()
让我看看我是否正确理解了您的意思。
尝试这样的事情:
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)
其中 n 是您要绘制的不同参数集的数量,width_n 是每个参数集的宽度,您根据标准化选择的任何单位。
subplots_adjust 将子图之间的 space 设置为 0。GridSpec 使您可以更精细地控制每个子图的大小。 sharey
标志不适用于 gridspec,因此我们必须 fiddle 手动设置 y 刻度。
然后您可以绘制每个参数集的函数,在轴的元素中,具有您想要的任何范围。基本上将轴的每个元素视为您希望连接在一起的图形之一。
使用与@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
确保最后一张图很好地切断。