Matplotlib: эквивалент столбчатой ​​диаграммы для line.set_ydata [дубликат]

Посмотрите на пункт UNPIVOT - я не уверен, что он применим для вашего случая, но в некоторых случаях его можно использовать для запроса значения по имени столбца без динамического SQL:

create table t1 (
  a int,
  b int,
  c int
);

insert into t1 values
(1, 11, 111),
(2, 22, 222),
(3, 33, 333);

select a, col_name, col_value from t1
unpivot (col_value for col_name in (b, c)) as dt;

Результат:

| a | col_name | col_value |
|---|----------|-----------|
| 1 |        b |        11 |
| 1 |        c |       111 |
| 2 |        b |        22 |
| 2 |        c |       222 |
| 3 |        b |        33 |
| 3 |        c |       333 |

( SQL Fiddle )

Если вам нужно только значение в a в зависимости от какое-либо условие (динамически) либо b, либо c, вы можете построить на нем условие. Если вам нужны значения в столбце b или c, вы можете добавить ... WHERE col_name = ?. Если вам нужно больше столбцов, вам, вероятно, нужно будет отфильтровать значения столбцов в таблице без поворота, чем развернуть его снова, чтобы вернуть значения в столбцах.

8
задан hfaran 27 April 2013 в 08:20
поделиться

2 ответа

Вы можете использовать animation.FuncAnimation . Разделите график штрихов один раз и сохраните возвращаемое значение, которое представляет собой набор Rects:

rects = plt.bar(range(N), x, align='center')

Затем, чтобы изменить высоту полосы, вызовите rect.set_height:

    for rect, h in zip(rects, x):
        rect.set_height(h)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def animate(frameno):
    x = mu + sigma * np.random.randn(N)
    n, _ = np.histogram(x, bins, normed=True)
    for rect, h in zip(patches, n):
        rect.set_height(h)
    return patches

N, mu, sigma = 10000, 100, 15
fig, ax = plt.subplots()
x = mu + sigma * np.random.randn(N)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)

frames = 100
ani = animation.FuncAnimation(fig, animate, blit=True, interval=0,
                              frames=frames,
                              repeat=False)
plt.show()
16
ответ дан unutbu 17 August 2018 в 14:39
поделиться

Если matplotlib не является принудительным вариантом, я бы порекомендовал систему Push Socket на сервере и основанную на Javascript графику для клиентской стороны. Сначала я перечислю несколько преимуществ:

  1. Клиент (ваш другой компьютер) должен иметь только современный веб-браузер и может запускать любую ОС и не нуждается в установке Python, Matplotlib
  2. Поскольку WebSockets будет работать в режиме широковещания, вы можете использовать любое количество клиентов для одного и того же фида, может быть очень полезно, если у вас будет демо-версия вашей системы
  3. Код на стороне клиента также эффективен, он сохраняет последние значения «х» и хорошо работает в режиме реального времени, поэтому все не нужно перерисовывать

Так как я делаю что-то очень похожее на мою малину, я могу поделитесь своими сведениями о том же. Это вдохновлено этой записью в блоге. Код для серверной стороны, который подталкивает данные, можно найти здесь здесь . Вероятно, вы увидите, что после установки зависимостей он очень похож на ваш код, и в конечном итоге вы найдете socket.send() даже в моем коде. Для стороны клиента этот является ссылкой на файл HTML, а этот - это JS, который запускается в браузере, который использует Flot Plotting библиотека. Я уверен, что демонстрация на их домашней странице достаточно удивительна, чтобы ее заметили!

2
ответ дан Nipun Batra 17 August 2018 в 14:39
поделиться
  • 1
    Большое спасибо за это, я посмотрю, как реализовать это как обновление. Тем не менее, мне все равно хотелось бы узнать, есть ли простое исправление моей исходной проблемы с обновлением графика matplotlib без очистки? – hfaran 27 April 2013 в 09:58
Другие вопросы по тегам:

Похожие вопросы: