多值直方图作为组合散点图和直方图

时间:2014-08-25 14:58:13

标签: python matplotlib plot gnuplot histogram

我的研究中有一些理论计算。我想通过取理论值并从实验值中减去它来表示这些数据的准确性。这留下了一些我希望绘制以显示此数据的差异。

我已经模拟了我正在寻找的情节类型。红线是图的零点,意味着理论值和实验值之间没有差异。 x轴具有V1,V2,...,VN,这些是要计算的不同的东西。问题是每个V都有两个或三个值,用我做的模拟图中的“X”表示。

example picture showing the problem

我对如何做到这一点有点失落。我尝试用Gnuplot查看多值直方图,尽管它显示为空。任何人都可以对此有任何见解,或者有一个有效的例子Gnuplot脚本吗?如果你知道用Python或其他方式做到这一点的方法,我也愿意使用其他想法。问题是我对Python一无所知。

2 个答案:

答案 0 :(得分:3)

使用gnuplot有几种方法可以实现这一点。这是一个选项,我觉得很合理::

  1. 将属于一个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
    
  2. 标签存储在一个字符串中,以空格字符分隔。 (使用此功能,您只能使用不包含空格的标签,引用不起作用)。

    labels = "v1 v2 v3"
    
  3. 作为x轴的数值,您可以使用特殊列-2获取数据块的编号,即使用using (column(-2))。此号码还可用于从labels字符串访问相应的标签。

  4. 以下是一个示例脚本:

    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的结果是:

    enter image description here

    当然,根据您的实际需要,您可以选择修改或扩展此脚本。

答案 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()

plot residuals