Python中基于条件绘制多色折线出现断裂问题求助
解决多色折线断裂问题的两种方法
John你好,我来帮你搞定这个折线断裂的问题!你遇到的情况是因为分组后每个片段只绘制了自己范围内的点,相邻片段的首尾点没有被同一次plot调用连接,所以Matplotlib不会自动把它们连起来。下面给你两种可行的解决方案:
方法一:分组时带上前一段的最后一个点
这种方法基于你原来的分组思路,只需要在绘制每个分组前,把前一个分组的最后一个点合并进来,保证相邻片段的首尾点能被同一条线段连接:
import pandas as pd import matplotlib.pyplot as plt trend = [0,0,0,1,1,1,-1,-1,-1,1,1,1,0,0,0,1,1,1,-1,-1] price = [1,2,3,4,5,6,5,4,3,4,5,6,7,8,9,8,7,6,5,4] df1 = pd.DataFrame({'Trend': trend, 'Price': price}) fig, ax = plt.subplots() # 按Trend变化分组 groups = df1.groupby((df1.Trend.shift() != df1.Trend).cumsum()) prev_last_point = None for _, group in groups: # 根据Trend匹配颜色 if (group.Trend == -1).all(): color = 'r' elif (group.Trend == 1).all(): color = 'g' else: color = 'b' # 合并前一段的最后一个点,保证连线连续 if prev_last_point is not None: plot_group = pd.concat([prev_last_point, group]) else: plot_group = group ax.plot(plot_group.index, plot_group.Price, c=color, linewidth=2.0) # 更新前一段的最后一个点为当前组的最后一行 prev_last_point = group.tail(1) plt.show()
方法二:逐段绘制相邻点(更简洁直观)
这种思路跳过分组操作,直接遍历每一对相邻的点,根据起始点的Trend设置线段颜色,每一段单独绘制,从根源上保证折线连续:
import pandas as pd import matplotlib.pyplot as plt trend = [0,0,0,1,1,1,-1,-1,-1,1,1,1,0,0,0,1,1,1,-1,-1] price = [1,2,3,4,5,6,5,4,3,4,5,6,7,8,9,8,7,6,5,4] df1 = pd.DataFrame({'Trend': trend, 'Price': price}) fig, ax = plt.subplots() # 建立Trend到颜色的映射表 color_map = {-1: 'r', 1: 'g', 0: 'b'} line_width = 2.0 # 遍历每一对相邻点,绘制单条线段 for i in range(len(df1)-1): # 获取当前线段的x、y坐标 x_coords = [df1.index[i], df1.index[i+1]] y_coords = [df1['Price'].iloc[i], df1['Price'].iloc[i+1]] # 根据当前点的Trend取颜色 segment_color = color_map[df1['Trend'].iloc[i]] ax.plot(x_coords, y_coords, c=segment_color, linewidth=line_width) plt.show()
个人更推荐第二种方法,代码更简洁,逻辑也更直观,不需要处理分组和首尾点的合并问题,而且完全避免了折线断裂的可能。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

