#python #pandas #matplotlib #data-visualization
Вопрос:
Приведенный ниже код берет данные (образец скопирован ниже) и выполняет точечную диаграмму, где форма рассеянной точки зависит от строкового значения первого столбца данных. фигуры выглядят правильно, но цветовая полоса не соответствует нормализованным цветам разбросанных точек! Прямой вызов цветовой панели делает ее независимой от графика, в то время как вызов внутри цикла покажет ее только несколько раз… Таким образом, цветовые панели должны быть независимыми (поддельными), но откалиброванными с использованием одних и тех же данных. В чем я не уверен, так это в том, что : c=cmap.to_rgba(i 1)
Окончательное изображение прилагается (img.png)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl ax = plt.gca() df = pd.read_csv('data.txt', delimiter="t") df.columns = ["type", "bv", "ron", "fom"] df = df._convert(numeric=True) norm = mpl.colors.Normalize(vmin=df.fom.min(), vmax=df.fom.max()) cmap = mpl.cm.ScalarMappable(norm=norm, cmap=mpl.cm.hot) cmap.set_array([]) for i in range(len(df.type)): if df.type[i] == 'a': sc = ax.scatter(df.bv[i], df.ron[i], marker='o', edgecolors='black', alpha=0.8, s=100, c=cmap.to_rgba(i 1), ) if df.type[i] == 'b': sc = ax.scatter(df.bv[i], df.ron[i], marker='d', edgecolors='black', alpha=0.8, s=100, c=cmap.to_rgba(i 1), ) if df.type[i] == 'c': sc = ax.scatter(df.bv[i], df.ron[i], marker='h', edgecolors='black', alpha=0.8, s=100, c=cmap.to_rgba(i 1), ) if df.type[i] == 'd': sc = ax.scatter(df.bv[i], df.ron[i], marker='H', edgecolors='black', alpha=0.8, s=100, c=cmap.to_rgba(i 1), ) if df.type[i] == 'e': sc = ax.scatter(df.bv[i], df.ron[i], marker='s', edgecolors='black', alpha=0.8, s=100, c=cmap.to_rgba(i 1), ) if df.type[i] == 'u': sc = ax.scatter(df.bv[i], df.ron[i], marker='lt;', edgecolors='black', alpha=0.8, s=100, c=cmap.to_rgba(i 1), ) plt.yscale('log') plt.xscale('log') plt.grid(True, which="both", ls="-", alpha=0.1) plt.colorbar(sc, ax=ax, norm=mpl.colors.Normalize(min(df.fom), max(df.fom)), cmap='hot', alpha=0.8) plt.show()
Изображение:
Образец данных:
type ron bv fom b 23 57 141,2608696 c 3238 535 88,39561458 d 11000 858 66,924 b 115 35,9 11,20704348 b 28 28 28 a 5 23 105,8 d 14500 977 65,82958621 d 3090 477 73,63398058 e 94 50 26,59574468 e 53 127 304,3207547 b 32,4 35,2 38,24197531 e 7,8 25 80,12820513 c 57 75 98,68421053 c 91 100 109,8901099 b 49 55 61,73469388 b 95 82 70,77894737 u 7,42 22,48 68,10652291
Ответ №1:
Попробуйте изменить структуру диаграммы рассеяния следующим образом:
cmap = mpl.cm.hot for ... sc = ax.scatter(df.bv[i], df.ron[i], marker='lt;', edgecolors='black', alpha=0.8, s=100, c=df.fom[i], norm=norm, cmap=cmap) .... fig.colorbar(sc) # without the norm and cmap and call outside the loop
Комментарии:
1. Да, это сработало. Только то, что cmap устанавливается как cmap=»горячий» в каждом условии.
sc = ax.scatter(df.bv[i], df.ron[i], marker='o', edgecolors='black', alpha=0.8, s=100, c=df.fom[i], norm=norm,cmap='hot' )