Как изменить цвета маркера в 3D-графике Python в зависимости от радиуса от источника? [Дубликат]

TL; DR

import pandas as pd
import numpy as np

def explode_str(df, col, sep):
    s = df[col]
    i = np.arange(len(s)).repeat(s.str.count(sep) + 1)
    return df.iloc[i].assign(**{col: sep.join(s).split(sep)})

def explode_list(df, col):
    s = df[col]
    i = np.arange(len(s)).repeat(s.str.len())
    return df.iloc[i].assign(**{col: np.concatenate(s)})

Демонстрация

explode_str(a, 'var1', ',')

  var1  var2
0    a     1
0    b     1
0    c     1
1    d     2
1    e     2
1    f     2

Давайте создадим новый dataframe d, который имеет списки

d = a.assign(var1=lambda d: d.var1.str.split(','))

explode_list(d, 'var1')

  var1  var2
0    a     1
0    b     1
0    c     1
1    d     2
1    e     2
1    f     2

Общие комментарии

Я буду использовать np.arange с repeat для создания позиций индекса данных, которые я могу использовать с iloc.

FAQ

Почему я не использую loc?

Поскольку индекс может быть не уникальным, и использование loc вернет каждую строку, которая соответствует запрошенному индексу.

Почему не используете ли вы values атрибут и срез?

При вызове values, если весь фрагмент данных находится в одном сплоченном «блоке», Pandas вернет представление массива это «блок». В противном случае Pandas придется собирать новый массив. При мольберге этот массив должен иметь одинаковый тип. Часто это означает возврат массива с dtype, который является object. Используя iloc вместо резки атрибута values, я избавляюсь от необходимости иметь дело с этим.

Почему вы используете assign?

Когда я использую assign, используя одно и то же имя столбца, которое я взорвав, я перезаписываю существующий столбец и сохраняю его позицию в фрейме данных.

Почему повторяются значения индекса?

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


Для строк

Я не хочу преждевременно разделить строки. Поэтому вместо этого я считаю вхождения аргумента sep, предполагая, что если бы я был разбит, длина результирующего списка была бы больше, чем количество разделителей.

Затем я использую это sep join строки split.

def explode_str(df, col, sep):
    s = df[col]
    i = np.arange(len(s)).repeat(s.str.count(sep) + 1)
    return df.iloc[i].assign(**{col: sep.join(s).split(sep)})

Для списков

Подобно тому, как для строк, за исключением того, что мне не нужно подсчитывать вхождения sep, потому что его уже split.

Я использую Numpy's concatenate, чтобы замять списки вместе.

import pandas as pd
import numpy as np

def explode_list(df, col):
    s = df[col]
    i = np.arange(len(s)).repeat(s.str.len())
    return df.iloc[i].assign(**{col: np.concatenate(s)})

12
задан andrea.ge 17 January 2012 в 12:33
поделиться

2 ответа

Следующие работы: Я не могу понять, почему у вас нет. Вы должны иметь возможность устанавливать цвет как последовательность RGBA-поплавков или просто последовательность поплавков.

# Create Map
cm = plt.get_cmap("RdYlGn")

x = np.random.rand(30)
y = np.random.rand(30)
z = np.random.rand(30)
col = np.arange(30)

# 2D Plot
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y, s=10, c=col, marker='o')  

# 3D Plot
fig = plt.figure()
ax3D = fig.add_subplot(111, projection='3d')
p3d = ax3D.scatter(x, y, z, s=30, c=col, marker='o')                                                                                

plt.show()

Однако в случае разброса я вижу следующее: это может быть связано.

    A :class:`matplotlib.colors.Colormap` instance or registered
    name. If *None*, defaults to rc ``image.cmap``. *cmap* is
    only used if *c* is an array of floats.
0
ответ дан Cenkoloji 25 August 2018 в 11:14
поделиться

Вот пример для 3d-рассеяния с цветами градиента:

import matplotlib.cm as cmx
from mpl_toolkits.mplot3d import Axes3D
def scatter3d(x,y,z, cs, colorsMap='jet'):
    cm = plt.get_cmap(colorsMap)
    cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs))
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter(x, y, z, c=scalarMap.to_rgba(cs))
    scalarMap.set_array(cs)
    fig.colorbar(scalarMap)
    plt.show()

Конечно, вы можете выбрать шкалу для диапазона между различными значениями, например 0 и 1.

17
ответ дан Noam Peled 25 August 2018 в 11:14
поделиться
Другие вопросы по тегам:

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