Gnuplot (или matplotlib): создание не гистограммы с категориями на оси X - PullRequest
4 голосов
/ 04 декабря 2011

Я хотел бы создать такой график, используя gnuplot (или matplotlib, если необходимо), но я не знаю, можно ли / как это сделать:

rough outline of what the graph should look like

Это, конечно, просто набросок. Важно то, что мне нужно построить пары значений (в этом примере каждая пара состоит из красной и синей точек). Один элемент из каждой пары представляет собой одно значение, другой должен отображать диапазон значений (моя идея заключалась в том, чтобы построить среднее значение с помощью полосок ошибок, чтобы указать максимальное и минимальное значения диапазона, но я открыт для лучших идей) , Ось X не имеет цели, кроме как дать названия различным категориям - все, что имеет значение, это значения y.

Я почти уверен, что мог бы создать что-то вроде этого (пары значений и x-категории), используя гистограммы, но в этом случае ящики просто кажутся мне неправильными.

Что у меня так далеко: У меня есть команда gnuplot:

plot 'TEST.out' using 0:2:3:xticlabel(1) w errorbars pt 7 notitle

Используется с этим файлом данных (имя категории, значение y, значение строки ошибок):

cat1 15 0
cat1 18 3
cat2 13 0
cat2 10 4

это дает график ниже, который идет в правильном направлении, но который еще не идеален (все точки данных имеют одинаковый цвет, и для единичных значений вы все еще можете видеть, что использовались полосы ошибок; также группировка isn ' это очень хорошо - если бы две точки, составляющие одну пару, были ближе друг к другу, что сделало бы сюжет легче для глаз).

where I have got so far

Если у кого-то есть какие-либо предложения (даже для создания графика, который не выглядит точно так же, как пример, который я привел в начале). Я был бы очень признателен.

Большое спасибо за ваше время!

Ответы [ 2 ]

5 голосов
/ 04 декабря 2011

В Matplotlib вы можете устанавливать галочки индивидуально. Метод объясняется в одном из примеров Матплотлиба .

Вот начало:

# Initializations:
from matplotlib import pyplot as pp
import numpy as np

pp.ion()  # "Interactive mode on": pyplot.* commands draw immediately

# Data:
series_red_y = [1.3, 1.4, 2.2]
series_blue_y = [1.6, 1.8, 1.8]
series_blue_err = [0.25, 0.25, 0.5]
names = ('Category 1', 'Category 2', 'Category 3')

# Where on the x-axis the data will go:    
series_red_x = np.arange(0, 3*len(series_red_y), 3)  # Step of 3: red dot, blue dot, empty space
series_blue_x = np.arange(1, 3*len(series_blue_y)+1, 3)  # Step of 3: red dot, blue dot, empty space

# Plotting:
pp.scatter(series_red_x, series_red_y, c='r', s=100)
pp.scatter(series_blue_x, series_blue_y, s=100)
pp.errorbar(series_blue_x, series_blue_y, yerr=series_blue_err, fmt=None,
            capsize=0)
pp.xticks((series_red_x+series_blue_x)/2., names)

# We wait until the user is ready to close the program:
raw_input('Press enter...')

Вот результат, который вы можете настроить в соответствии со своими потребностями:

enter image description here

1 голос
/ 06 декабря 2011

Вот решение gnuplot:

set xrange [-.25:2.75]
set xtics ('cat0' .25, 'cat1' 1.25, 'cat2' 2.25)
plot '< sed 1~2!d TEST.out' using 0:2:(.1) with circles, \
     '< sed 1~2d TEST.out' using (.5+$0):2:3 with errorbars

Возможно, вам потребуется сгенерировать первые две строки скрипта, если количество категорий не известно заранее. Это должно быть довольно легко, например в баш:

cat_count=$(wc -l < TEST.out)
let cat_count/=2
let cat_count--
echo xrange "[-.25:$cat_count.75]"
echo -n 'set xtics('
for i in $(seq 0 $cat_count) ; do
    echo -n "'cat$i'" $i.25
    ((i==cat_count)) || echo -n ,
done
echo ')'
...