Присоединить точки данных с непрерывными линиями [дублировать]

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

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

echo '{"hostname":"test","domainname":"example.com"}' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["hostname"]'
5
задан MnZrK 24 January 2013 в 14:33
поделиться

2 ответа

Хорошо, я сделал несколько удовлетворительное решение. Это многословие и все еще немного хакерское, но оно работает!

Он работает, создавая пользовательский объект matplotlib.transforms.Transform для каждого из них. линейный патч в сюжете. Это, конечно, медленное решение, но графики такого рода не предназначены для использования с сотнями или тысячами точек, поэтому я думаю, что производительность не такая уж большая.

В идеале все эти исправления необходимы для объединения в одну «сюжетную линию», но она мне подходит как есть.

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

class MyTransform(mpl.transforms.Transform):
  input_dims = 2
  output_dims = 2
  def __init__(self, base_point, base_transform, offset, *kargs, **kwargs):
    self.base_point = base_point
    self.base_transform = base_transform
    self.offset = offset
    super(mpl.transforms.Transform, self).__init__(*kargs, **kwargs)
  def transform_non_affine(self, values):
    new_base_point = self.base_transform.transform(self.base_point)
    t = mpl.transforms.Affine2D().translate(-new_base_point[0], -new_base_point[1])
    values = t.transform(values)
    x = values[:, 0:1]
    y = values[:, 1:2]
    r = np.sqrt(x**2+y**2)
    new_r = r-self.offset
    new_r[new_r<0] = 0.0
    new_x = new_r/r*x
    new_y = new_r/r*y
    return t.inverted().transform(np.concatenate((new_x, new_y), axis=1))

def my_plot(X,Y):
  ax = plt.gca()
  line, = ax.plot(X, Y, marker='o', linestyle='')
  color = line.get_color()

  size = X.size
  for i in range(1,size):
    mid_x = (X[i]+X[i-1])/2
    mid_y = (Y[i]+Y[i-1])/2

    # this transform takes data coords and returns display coords
    t = ax.transData

    # this transform takes display coords and 
    # returns them shifted by `offset' towards `base_point'
    my_t = MyTransform(base_point=(mid_x, mid_y), base_transform=t, offset=10)

    # resulting combination of transforms
    t_end = t + my_t

    line, = ax.plot(
      [X[i-1], X[i]],
      [Y[i-1], Y[i]],
      linestyle='-', color=color)
    line.set_transform(t_end)

fig = plt.figure(figsize=(8,6))
axes = plt.subplot(111)

X = np.linspace(0,2*np.pi, 8)
Y = np.sin(X)
my_plot(X,Y)
plt.show()

enter image description here [/g0]

4
ответ дан MnZrK 22 August 2018 в 00:27
поделиться

Можно ли просто сделать толстую белую границу вокруг ваших маркеров? Это не обычай linestyle, а простой способ получить аналогичный эффект:

y = np.random.randint(1,9,15)

plt.plot(y,'o-', color='black', ms=10, mew=5, mec='white')
plt.ylim(0,10)

enter image description here [/g0]

Здесь ключом являются аргументы

  • mec='white', цвет маркера белого маркера
  • ms=10, маркеры 10 баллов (это довольно большой),
  • mew=5, ширина края маркера 5 точек , так что эффективно точки 10-5 = 5 баллов.
4
ответ дан ImportanceOfBeingErnest 22 August 2018 в 00:27
поделиться
  • 1
    Ну, это не идеально, потому что это ограничивает способность украшать маркеры. Кроме того, если есть другой пересекающийся сюжет, его части будут стерты - посмотрите на эту цифру . – MnZrK 24 January 2013 в 14:24
Другие вопросы по тегам:

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