Python Matplotlib Axes3D Scatter - заполнение по категориальным значениям [дубликат]

Это обходной путь для дефектного поведения, а не ответ на вопрос, есть ли ошибка в VCL и несколько мыслей.

Обходной путь - установить фоновый режим устройства контекст, назначенный общим элементом управления для рисования элементов, по сравнению с прозрачным, после выполнения пользовательского чертежа:

procedure TForm1.ListViewCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  R: TRect;
begin
  if not [CustomDrawing] then  // <- If we're not gonna do anything do not
    Exit;                      //    fiddle with the DC in any way

  DefaultDraw := False;
  ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @R);
  Sender.Canvas.MoveTo(R.Left, R.Top);
  Sender.Canvas.LineTo(R.Right-1, R.Bottom-1);

  SetBkMode(Sender.Canvas.Handle, TRANSPARENT); // <- will effect the next [sub]item
end; 

В цикле краски [sub], картина всегда выполняется сверху вниз, элементы с более низким индексом отправляются NM_CUSTOMDRAW уведомления до тех, у кого более высокие индексы. Когда мышь перемещается из одной строки в другую, нужно перерисовать две строки - одну, которая теряет состояние hot , а другая - получает его. Казалось бы, когда пользовательский чертеж не действует, рисование строки, которая теряет горячее состояние, оставляет DC в нежелательном состоянии. Это не проблема при перемещении мыши вверх, потому что этот элемент нарисован последним.

Пользовательский чертеж Элементы управления ListView и TreeView отличаются от пользовательского рисования других элементов управления и несколько сложны (см. Custom Draw With Элементы управления List-View и Tree-View ). Но вы полностью контролируете весь процесс. Код в NM_CUSTOMDRAW случае TCustomListView.CNNotify в «comctrls.pas» VCL одинаково сложный. Но, несмотря на то, что вам предоставлена ​​куча пользовательских обработчиков чертежей (половина из них advanced ), вы не можете контролировать то, что делает VCL. Например, вы не можете вернуть CDRF_xxx, который вам нужен, или вы не можете установить желаемый clrTextBk. Мое предубежденное мнение состоит в том, что есть проблема с ошибкой / дизайном в управлении представлением списка Delphi , но у меня нет ничего более конкретного, чем интуиция, как при поиске обходного пути.

9
задан jxn 30 January 2015 в 06:11
поделиться

3 ответа

Свойство color= или c= должно быть цветом matplotlib, как указано в документации для plot .

Чтобы сопоставить целочисленную метку с цветом просто сделайте

LABEL_COLOR_MAP = {0 : 'r',
                   1 : 'k',
                   ....,
                   }

label_color = [LABEL_COLOR_MAP[l] for l in labels]
plt.scatter(x, y, c=label_color)

Если вы не хотите использовать встроенные односимвольные имена цветов, вы можете использовать другие определения цветов. См. Документацию по цветам matplotlib.

3
ответ дан Hannes Ovrén 22 August 2018 в 13:12
поделиться
  • 1
    Вместо того, чтобы вручную вводить цвет для каждого нового кластера, как мы используем colormap , чтобы в случае изменения номера кластера в будущем мне больше не нужно добавлять новый цвет? – jxn 30 January 2015 в 11:43
  • 2
    Или используйте встроенные цветовые карты в mpl.colors – tacaswell 30 January 2015 в 16:09
  • 3
    – Hannes Ovrén 30 January 2015 в 16:12
  • 4
    вам просто нужно масштабировать их между 0 и 1 для непрерывных цветных карт. Если у вас так много ярлыков, что вы перестаете понимать разницу на непрерывных цветовых картах, у вас слишком много ярлыков – tacaswell 30 January 2015 в 16:16
  • 5
    Да, я думаю, ты прав. Просто хотел указать на потенциальные ловушки :) – Hannes Ovrén 30 January 2015 в 16:20

Он должен работать:

from sklearn.cluster import KMeans;
cluster = KMeans(10);
cluster.fit(M);

cluster.labels_;

plt.scatter(M[:,0],M[:,1], c=[matplotlib.cm.spectral(float(i) /10) for i in cluster.labels_]);   
1
ответ дан user3805442 22 August 2018 в 13:12
поделиться
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# Scaling the data to normalize
model = KMeans(n_clusters=5).fit(X)

# Visualize it:
plt.figure(figsize=(8, 6))
plt.scatter(data[:,0], data[:,1], c=model.labels_.astype(float))

Теперь у вас разные цвета для разных кластеров.

5
ответ дан Zayne Na 22 August 2018 в 13:12
поделиться
Другие вопросы по тегам:

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