基于数据点聚类的散点图颜色栏

时间:2019-07-18 07:03:21

标签: python-3.x matplotlib scatter-plot

我正在尝试实现类似于此的情节:

enter image description here

颜色显示数据点的聚类。

到目前为止,我的代码:

import pandas as pd
import readTrc
import matplotlib.pyplot as plt
import numpy as np
import os
import gc

trcpath = 'filename.trc'
datX, datY, m = readTrc.readTrc(trcpath)
srx, sry = pd.Series(datX * 1000), pd.Series(datY * 1000)
df_plot = pd.concat([srx, sry], axis = 1)
df_plot.set_index(0, inplace = True)
fig, ax = plt.subplots()

#Eliminate Noise
df_plot[df_plot < 3] = 0
df = df_plot[df_plot > 3]
df[df < 3] = None
df = df.dropna()

#Plot Parameters
p = np.array(df[1].tolist()[:-1])
p_nach = np.array(df[1].tolist()[1:])
d_t = np.array(pd.Series(df.index).diff().tolist()[1:])

#Graph Limit
graphlim = 101

#Plot
plt.scatter(p, p_nach,
            edgecolors = 'none',
            c = p,
            s = 20,
            cmap=plt.cm.get_cmap('jet'))
plt.xlim(0,graphlim)
plt.ylim(0,graphlim)
plt.xticks(range(0,graphlim,int(graphlim/10)))
plt.yticks(range(0,graphlim,int(graphlim/10)))
plt.colorbar()
plt.grid(zorder = 0, alpha = 0.3)
ax.set_xlabel('p / mV')
ax.set_ylabel('p_nach / mV')

##plt.savefig(dpi = 300)
plt.show()
##plt.close()
##fig.clear()
##gc.collect()

print('Progress... done!')

enter image description here

如您所见,颜色栏不代表聚类,而是代表x轴上的位置。如何配置颜色条以表示区域中的数据点数量?

包含文件的文件夹:Link

1 个答案:

答案 0 :(得分:0)

import pandas as pd
import readTrc
import matplotlib.pyplot as plt
import numpy as np
import os
import gc

trcpath = 'filename.trc'
datX, datY, m = readTrc.readTrc(trcpath)

df = pd.DataFrame({'time': datX * 1000, 'volts': datY * 1000})

reduce_noise_df = df[df.volts >= 3.0]

d_t = reduce_noise_df.time.diff()[1:]

p = reduce_noise_df.volts[:-1]

p_nach = reduce_noise_df.volts[1:]

#Graph Limit
graphlim = 41

#Plot
fig, ax = plt.subplots(figsize=(6,6))
plt.scatter(p, p_nach,
            edgecolors = 'none',
            c = d_t,
            s = 20,
            cmap=plt.cm.get_cmap('jet'))
plt.xlim(0, graphlim)
plt.ylim(0, graphlim)
plt.xticks(range(0, graphlim, int(graphlim/10)))
plt.yticks(range(0, graphlim, int(graphlim/10)))
plt.colorbar()
plt.grid(zorder = 0, alpha = 0.3)
ax.set_xlabel('p / mV')
ax.set_ylabel('p_nach / mV')
plt.show()
  1. 我开始删除不必要的代码
  2. 主要问题是c = p,而不是c = d_t

enter image description here

Le Croy WR640Zi的波形图,按数据密度着色

import pandas as pd
import readTrc
import matplotlib.pyplot as plt
import numpy as np
import os
import gc
from scipy.stats import gaussian_kde

trcpath = 'filename.trc'
datX, datY, m = readTrc.readTrc(trcpath)

df = pd.DataFrame({'time': datX * 1000, 'volts': datY * 1000})

reduce_noise_df = df[df.volts >= 3.0]

y = np.array(reduce_noise_df.volts.tolist())
x = np.array(reduce_noise_df.time.tolist())

# Calculate point density
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)

# Sort points by density
idx = z.argsort()
x, y, z = x[idx], y[idx], z[idx]

#Plot
fig, ax = plt.subplots(figsize=(6,6))
plt.scatter(x, y,
            edgecolors = 'none',
            c = z,
            s = 20,
            cmap=plt.cm.get_cmap('jet'))
plt.colorbar()
plt.grid(zorder = 0, alpha = 0.3)
ax.set_xlabel('Time (ms)')
ax.set_ylabel('Voltage (mV)')
plt.show()

enter image description here