2015-10-30 3 views
1

У меня есть функция для построения графика графики с использованием pyplot. Код здесь:Добавление вторичной оси X с определяемым пользователем списком координат

def plot_results(results, expers): 
    """ 
    type results: list[list[float]] 
    type expers: list[int] 
    """ 
    label_builder = lambda index: 'experiment ' + str(index + 1) 
    colors = ('green', 'blue') 
    x_indices = list(map(compute_filesize, list(range(np.shape(results)[1])))) 
    x_percents = list(map(compute_percent, list(range(np.shape(results)[1])))) 

    fig, ax1 = plt.subplots() 
    for i in range(expers): 
     ax1.plot(x_indices, results[i], color=colors[i], lw=2, label=label_builder(i)) 
    ax1.legend() 
    plt.show() 

Для каждого значения expers списка моя функция строит диаграмму. Например, if len(results) == len (expers) == 2, я получить такой график: enter image description here

нужно создать вторичный X-ось (аналогично this, но это может быть по оси Х, и она будет расположена на верхней части графика). Другое отличие состоит в том, что Мне нужно установить список координат вручную (например, ax2.set_coords (x_percents)).

Я создал новую ось, используя ax2 = ax1.twinx(). Затем я установил список координат, используя ax2.set_xticks(x_percents).

Но из-за каждый x_percents[i] < x_indices[i], я получил такую ​​картину:

enter image description here

(как вы можете видеть, все координаты новой оси расположены в левом нижнем углу)

Как я могу изменить свою функцию, чтобы сделать новый X-ось:

  • , расположенный на верхней части графика,

  • имеет свою собственную шкалу, т.е. каждое значение x_percents соответствует значению results[i] и x_percents диспергированного в интервале?

+0

Вы хотите на самом деле построить данные с этой другой осью или это вторая ось, просто очередная презентация первой? – MaxNoe

+1

также 'np.arange (results.shape [1])' будет чище и быстрее, чем то, что вы делаете сейчас – MaxNoe

ответ

1

Ваш код предполагает, что x_indices и x_percents линейно связаны между собой. Для того, чтобы держать вещи ясно и полезно для других, я буду считать следующее для этих 2-х переменных:

x_indices = [0, 5, 10, 25, 50] 
max_size = max(x_indices) 
x_percents = [ n/max_size * 100 for n in x_indices] 

Одним из способов можно добиться создания этих сдвоенных осей, которые связаны с теми же данными, но просто разные ярлыки, как идет это: сначала создайте оси, затем создайте еще один над, что (методы twinx/twiny можно использовать, но не обязательно, я буду использовать их здесь для удобства и объясню важную проблему, в результате которой вы устанавливаете xticks для ваши первые топоры). Затем обеспечить пределы обоего х осей одинаковы, установить положение х-клещи такой же, как в первых осях и, наконец, изменить метки:

import matplotlib.pyplot as plt 

vals = [1, 100, 14, 76, 33] # random data, aligned to `x_indices` 
fig, ax1 = plt.subplots(1,1) 
ax1.plot(x_indices, vals) 
ax2 = ax1.twiny() # Remark: twiny will create a new axes 
       # where the y-axis is shared with ax1, 
       # but the x-axis is independant - important! 
ax2.set_xlim(ax1.get_xlim()) # ensure the independant x-axes now span the same range 
ax2.set_xticks(x_indices) # copy over the locations of the x-ticks from the first axes 
ax2.set_xticklabels(x_percents) # But give them a different meaning 

simple example of adding two related axes to one graph

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

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