我从一个名为(' BW1_StartValues')的excel文件导入3列值(C,h,L *),表示以数字方式定义颜色的坐标。 L,C,h的每一行定义特定的颜色。
我想创建一个包含2个数字的交互式散点图,其中一个用于绘制C和h,另一个用于绘制L沿垂直线。我希望能够将两个图中的每个点相关联,例如,当我点击第一个图中的一个点时,我会在第二个图中看到它的相关值。
我在stackoverflow上发现了一段类似于我想要的代码,但是当我从文件导入数据然后尝试使用代码时,我遇到了问题。我是Python的新手,无法找到我的代码错误的地方。
感谢您的帮助! 高塞尔
def main():
fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(15,8))
gs = gridspec.GridSpec(1, 2, width_ratios=[8, 1])
df1 = read_excel('BW1_StartValues.xlsx')
C = df1['C']
h = df1['h']
L = df1['L*']
x1 = np.ones((14,1))
for (ax1,ax2), marker in zip((ax1,ax2), ['o', 'o']):
x = C
y = h
x,y = x,y
ax1 = fig.add_subplot(gs[0])
ax1.plot(h,C, ls='',marker = marker, label = 'BW1 samples' )
ax1.plot(h_mean, C_mean, ls='',marker = marker, color='red', label = 'mean value')
ax1.set_xlabel('h', fontsize = 14)
ax1.set_ylabel('C*', fontsize = 14)
ax1.legend(loc='lower right', fontsize = 15)
ax1.set_xlim(255,280)
ax1.set_ylim(25,50)
ax2 = fig.add_subplot(gs[1])
axe2.set_ylabel('L*', fontsize = 14)
ax2.yaxis.set_ticks_position('both')
ax2.set_xlim(0.8,1.2,1)
ax2.tick_params(labelleft='off',labelright='on')
ax2.yaxis.set_label_position('right')
plt.suptitle('BW1 samples', y = 0.95)
ax2.plot(x1, L, ls='', marker=marker)
ax2.plot(1, L_mean, ls='', marker=marker, color='red')
plt.subplots_adjust(wspace=0.05, top =0.95)
IndexedHighlight((ax1,ax2))
plt.show()
class IndexedHighlight(HighlightingDataCursor):
def __init__(self, axes, **kwargs):
# Use the first plotted Line2D in each axes
artists = [ax.lines[0] for ax in axes]
kwargs['display'] = 'single'
HighlightingDataCursor.__init__(self, artists, **kwargs)
self.highlights = [self.create_highlight(artist) for artist in artists]
plt.setp(self.highlights, visible=False)
def update(self, event, annotation):
# Hide all other annotations
plt.setp(self.highlights, visible=False)
# Highlight everything with the same index.
artist, ind = event.artist, event.ind
for original, highlight in zip(self.artists, self.highlights):
h, C = original.get_data()
highlight.set(visible=True, xdata=h[ind], ydata=C[ind])
DataCursor.update(self, event, annotation)
main()