我的研究中有一些理论计算。我想通过取理论值并从实验值中减去它来表示这些数据的准确性。这留下了一些我希望绘制以显示此数据的差异。
我已经模拟了我正在寻找的情节类型。红线是图的零点,意味着理论值和实验值之间没有差异。 x轴具有V1,V2,...,VN,这些是要计算的不同的东西。问题是每个V都有两个或三个值,用我做的模拟图中的“X”表示。
我对如何做到这一点有点失落。我尝试用Gnuplot查看多值直方图,尽管它显示为空。任何人都可以对此有任何见解,或者有一个有效的例子Gnuplot脚本吗?如果你知道用Python或其他方式做到这一点的方法,我也愿意使用其他想法。问题是我对Python一无所知。
答案 0 :(得分:3)
使用gnuplot有几种方法可以实现这一点。这是一个选项,我觉得很合理::
将属于一个v
- 值的值存储在一个数据块中。两个数据块由两个新行分开。因此,示例数据文件可能是:
# v1 values
-0.5
1.1
0.4
-0.2
# v2 values
-0.1
0.1
-0.7
# v3 values
0.9
0.5
0.2
标签存储在一个字符串中,以空格字符分隔。 (使用此功能,您只能使用不包含空格的标签,引用不起作用)。
labels = "v1 v2 v3"
作为x轴的数值,您可以使用特殊列-2
获取数据块的编号,即使用using (column(-2))
。此号码还可用于从labels
字符串访问相应的标签。
以下是一个示例脚本:
set xzeroaxis lc rgb 'red' lt 1 lw 2
set offset 0.2,0.2,0,0
set xtics 1
unset key
set linetype 1 linetype 2 lc rgb 'black' lw 2
labels = "v1 v2 v3"
plot 'data.dat' using (column(-2)):1:xtic(word(labels, column(-2)+1))
4.6.5的结果是:
当然,根据您的实际需要,您可以选择修改或扩展此脚本。
答案 1 :(得分:1)
你似乎没有计算任何东西,所以你的情节不是直方图。这是一堆水平排列的垂直1D散点图。
以下使用matplotlib非常接近你的模拟(出于习惯,我将“差异”重命名为相当传统的术语“Residuals”):
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
# Demo data consists of a list of names of the "variables",
# and a list of the residuals (in numpy arrays) for each variable.
names = ['V1', 'V2', 'V3', 'V4']
r1 = np.random.randn(3)
r2 = np.random.randn(2)
r3 = np.random.randn(3)
r4 = np.random.randn(3)
residuals = [r1, r2, r3, r4]
# Make the plot
for k, (name, res) in enumerate(zip(names, residuals)):
plt.plot(np.zeros_like(res) + k, res, 'kx',
markersize=7.0, markeredgewidth=2)
plt.ylabel("Residuals", fontsize=14)
plt.xlim(-1, len(names))
ax = plt.gca()
ax.set_xticks(range(len(names)))
ax.set_xticklabels(names)
plt.axhline(0, color='r')
plt.show()