Это обходной путь для дефектного поведения, а не ответ на вопрос, есть ли ошибка в 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 , но у меня нет ничего более конкретного, чем интуиция, как при поиске обходного пути.
Свойство 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.
Он должен работать:
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_]);
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))
Теперь у вас разные цвета для разных кластеров.
mpl.colors
– tacaswell 30 January 2015 в 16:09