使用散景(pyspark 数据框)逐年显示线图的问题

Issues in displaying year by year line plot using bokeh (pyspark dataframe)

当我尝试使用散景从 pyspark 数据帧显示线图时遇到问题,它已成功显示,但它显示了我不期望的内容。问题是一些线图点没有按顺序逐年连接。

之前我尝试使用 orderBy 对源数据框进行排序:

# Join df_max, and df_avg to df_quake_freq    
df_quake_freq = df_quake_freq.join(df_avg, ['Year']).join(df_max, ['Year'])    
df_quake_freq = df_quake_freq.orderBy(asc('Year'))    
df_quake_freq.show(5)

输出是: dataframe source for line plot

这是绘图代码:

    # Create a magnitude plot
def plotMagnitude():
    # Load the datasource
    cds = ColumnDataSource(data=dict(
        yrs = df_quake_freq['Year'].values.tolist(),
        avg_mag = df_quake_freq['Avg_Magnitude'].round(1).values.tolist(),
        max_mag = df_quake_freq['Max_Magnitude'].values.tolist()
    ))
    
    # Tooltip
    TOOLTIPS = [
        ('Year', ' @yrs'),
        ('Average Magnitude', ' @avg_mag'),
        ('Maximum Magnitude', ' @max_mag')
    ]
    
    # Create the figure
    mp = figure(title='Maximum and Average Magnitude by Year',
               plot_width=1150, plot_height=400,
               x_axis_label='Years',
               y_axis_label='Magnitude',
               x_minor_ticks=2,
               y_range=(5, df_quake_freq['Max_Magnitude'].max() + 1),
               toolbar_location=None,
               tooltips=TOOLTIPS)
    
    # Max Magnitude
    mp.line(x='yrs', y='max_mag', color='#cc0000', line_width=2, legend='Max Magnitude', source=cds)
    mp.circle(x='yrs', y='max_mag', color='#cc0000', size=8, fill_color='#cc0000', source=cds)
    
    # Average Magnitude 
    mp.line(x='yrs', y='avg_mag', color='yellow', line_width=2, legend='Avg Magnitude', source=cds)
    mp.circle(x='yrs', y='avg_mag', color='yellow', size=8, fill_color='yellow', source=cds)
    
    mp = style(mp)
    
    show(mp)
    
    return mp

plotMagnitude()

输出是: line plot

从图中我们可以看出,有些点并不是按顺序连接的,比如1965-1967-1966

我的问题解决了,点没有排序的原因是plotMagnitude函数依赖全局变量,所以为了处理这个我把 sort.values() 函数内部。这是语法:

def plotMagnitude():
# Load the datasource
cds = ColumnDataSource(data=dict(
    yrs = df_quake_freq['Year'].sort_values().values.tolist(),
    avg_mag = df_quake_freq['Avg_Magnitude'].round(1).values.tolist(),
    max_mag = df_quake_freq['Max_Magnitude'].values.tolist()