趋势(一)利用python绘制折线图

news2024/11/24 8:44:46

趋势(一)利用python绘制折线图

折线图( Line Chart)简介

1

折线图用于在连续间隔或时间跨度上显示定量数值,最常用来显示趋势和关系(与其他折线组合起来)。折线图既能直观地显示数量随时间的变化趋势,也能展示两个变量的关系。

快速绘制

  1. 基于matplotlib

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 自定义数据
    values = np.cumsum(np.random.randn(1000,1))
    
    # 绘制折线图
    plt.plot(values)
    plt.show()
    

    2

  2. 基于seaborn

    import seaborn as sns
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 自定义数据
    values = np.cumsum(np.random.randn(1000,1))
    
    # 绘制折线图
    sns.lineplot(x=np.array(range(1, 1001)), y=values.ravel())  # 使用 ravel() 将 values 转化为一维
    plt.show()
    

    3

  3. 基于plotly

    import plotly.graph_objects as go
    import numpy as np
    
    # 自定义数据
    values = np.cumsum(np.random.randn(1000,1))
    
    # 绘制折线图
    fig = go.Figure(data=go.Scatter(x=list(range(1, 1001)), 
                                    y=values.ravel(), 
                                    mode='lines'))
    fig.show()
    

    4

  4. 基于pandas

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    # 自定义数据
    values = np.cumsum(np.random.randn(1000,1))
    df = pd.DataFrame(values, columns=['Values'])
    
    # 绘制折线图
    df.plot()
    plt.show()
    

    5

定制多样化的折线图

自定义折线图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。

通过matplotlib绘制多样化的折线图

matplotlib主要利用plot绘制折线图,可以通过matplotlib.pyplot.plot了解更多用法

  1. 修改参数

    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    
    # 自定义数据
    df=pd.DataFrame({'x_values': range(1,11), 'y_values': np.random.randn(10) })
    
    # 初始化布局
    fig = plt.figure(figsize=(12,3))
    
    # 自定义颜色
    plt.subplot(1, 3, 1) 
    plt.plot( 'x_values', 'y_values', data=df, color='skyblue')
    plt.title('自定义颜色')
    
    # 自定义透明度
    plt.subplot(1, 3, 2) 
    plt.plot( 'x_values', 'y_values', data=df, color='skyblue', alpha=0.3)
    plt.title('自定义透明度')
    
    # 自定义线条
    plt.subplot(1, 3, 3) 
    plt.plot( 'x_values', 'y_values', data=df, linestyle='dashed', linewidth=5)
    plt.title('自定义线条')
    
    
    plt.show()
    

    6

  2. 带注释的折线图

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    
    # 自定义数据
    dates = []
    
    for date in range(1970,2023):
        dates.append(str(date))
    
    
    sample_size = 2023-1970
    variable = np.random.normal(100,
                                15,
                                sample_size,
                               )
    
    df = pd.DataFrame({'date': dates,
                       'value': variable})
    
    
    # 初始化布局
    fig = plt.figure(figsize=(12,8))
    
    
    # 1-基本折线图
    plt.subplot(2, 1, 1) 
    plt.plot(df['date'], df['value'])
    
    # 轴标签
    plt.xlabel('X-axis')
    plt.ylabel('Y-axis')
    plt.title('基本折线图')
    
    # 刻度
    plt.xticks(rotation=45)
    
    
    # 2-带注释的折线图
    plt.subplot(2, 1, 2) 
    plt.plot(df['date'], df['value'])
    
    # 轴标签
    plt.xlabel('X-axis')
    plt.ylabel('Y-axis')
    plt.title('带注释的折线图')
    
    # 刻度
    plt.xticks(rotation=45)
    
    # 添加文本注释
    plt.text(df['date'].iloc[38], # x位置
             df['value'].iloc[1], # y位置
             'What a nice chart!', # 文本注释
             fontsize=13,
             color='red')
    
    # 找到最大值索引
    highest_index = df['value'].idxmax()
    
    # 最高值标记
    plt.scatter(df['date'].iloc[highest_index],
                df['value'].iloc[highest_index],
                color='blue',
                marker='o', # 标记特殊的店
                s=100,
               )
    
    # 计算均值
    median_value = df['value'].median()
    
    # 添加均值线
    plt.axhline(y=median_value, color='green', linestyle='--', label='Reference Line (Median)')
    
    
    fig.tight_layout() # 自动调整间距
    plt.show()
    

    7

  3. 对数变换的折线图

    import matplotlib.pyplot as plt
    from matplotlib.ticker import MultipleLocator
    import numpy as np
    import pandas as pd
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    
    # 自定义数据
    x = np.linspace(1, 10, 100)
    y = np.exp(x)
    df = pd.DataFrame({'x': x, 'y': y})
    
    # 初始化布局
    fig = plt.figure(figsize=(12,4))
    
    
    # 1-基本折线图
    plt.subplot(1, 2, 1) 
    plt.plot(df['x'], df['y'])
    
    # 轴标签
    plt.xlabel('X-axis')
    plt.ylabel('Y-axis')
    plt.title('基本折线图')
    
    # 添加网格线
    plt.grid(True, linestyle='--', alpha=0.6)
    
    # 2-对数转化折线图
    plt.subplot(1, 2, 2) 
    plt.plot(df['x'], df['y'])
    
    # y轴对数化
    plt.yscale('log')
    
    # 轴标签
    plt.xlabel('X-axis')
    plt.ylabel('Y-axis')
    plt.title('对数化的折线图')
    
    # 对数刻度的网格
    y_major_locator = MultipleLocator(3000) 
    plt.gca().yaxis.set_major_locator(y_major_locator)
    
    # 添加网格线
    plt.grid(True, linestyle='--', alpha=0.6)
    
    plt.show()
    

    8

  4. 双轴折线图

    import matplotlib.pyplot as plt
    import numpy as np
    from datetime import datetime, timedelta
    from matplotlib import colors
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    
    rng = np.random.default_rng(1234)
    
    date = [datetime(2019, 1, 1) + timedelta(i) for i in range(100)]
    temperature = np.arange(100) ** 2.5 / 10000 + rng.uniform(size=100)
    price = np.arange(120, 20, -1) ** 1.5 / 10 + rng.uniform(size=100)
    
    # 设置多子图
    fig, axarr = plt.subplots(2, 2, figsize=(12, 8))
    
    # 1-基础的双轴折线图
    ax1 = axarr[0, 0]
    ax2 = ax1.twinx()
    ax1.plot(date, temperature)
    ax2.plot(date, price)
    ax1.set_title('基础的双轴折线图')
    
    # 2-自定义颜色双轴
    COLOR_TEMPERATURE = "#69b3a2"
    COLOR_PRICE = "#3399e6"
    
    ax1 = axarr[0, 1]
    ax2 = ax1.twinx()
    ax1.plot(date, temperature, color=COLOR_TEMPERATURE, lw=3)
    ax2.plot(date, price, color=COLOR_PRICE, lw=4)
    
    ax1.set_xlabel("Date")
    ax1.set_ylabel("Temperature (Celsius °)", color=COLOR_TEMPERATURE, fontsize=14)
    ax1.tick_params(axis="y", labelcolor=COLOR_TEMPERATURE)
    ax2.set_ylabel("Price ($)", color=COLOR_PRICE, fontsize=14)
    ax2.tick_params(axis="y", labelcolor=COLOR_PRICE)
    ax1.set_title('自定义颜色双轴')
    
    # 3-折线与条形图组合
    ax1 = axarr[1, 0]
    ax2 = ax1.twinx()
    ax1.bar(date, temperature, color=COLOR_TEMPERATURE, edgecolor="black", alpha=0.4, width=1.0)
    ax2.plot(date, price, color=COLOR_PRICE, lw=4)
    
    ax1.set_xlabel("Date")
    ax1.set_ylabel("Temperature (Celsius °)", color=COLOR_TEMPERATURE, fontsize=14)
    ax1.tick_params(axis="y", labelcolor=COLOR_TEMPERATURE)
    
    ax2.set_ylabel("Price ($)", color=COLOR_PRICE, fontsize=14)
    ax2.tick_params(axis="y", labelcolor=COLOR_PRICE)
    
    fig.autofmt_xdate()
    ax1.set_title("折线与条形图组合")
    
    # 4-自定义组合图样式
    color = list(colors.to_rgba(COLOR_TEMPERATURE))
    color[3] = 0.4
    
    ax1 = axarr[1, 1]
    ax2 = ax1.twinx()
    ax1.bar(date, temperature, color=color, edgecolor="black", width=1.0)
    ax2.plot(date, price, color=COLOR_PRICE, lw=4)
    
    ax1.set_xlabel("Date")
    ax1.set_ylabel("Temperature (Celsius °)", color=COLOR_TEMPERATURE, fontsize=14)
    ax1.tick_params(axis="y", labelcolor=COLOR_TEMPERATURE)
    
    ax2.set_ylabel("Price ($)", color=COLOR_PRICE, fontsize=14)
    ax2.tick_params(axis="y", labelcolor=COLOR_PRICE)
    
    fig.autofmt_xdate()
    ax1.set_title("自定义组合图样式")
    
    
    fig.tight_layout() # 自动调整间距
    plt.show()
    

    9

  5. 多个折线图

    import matplotlib.pyplot as plt
    import numpy as np
    from datetime import datetime, timedelta
    from matplotlib import colors
    import matplotlib.gridspec as gridspec
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    
    # 创建 2x3 的大布局
    fig = plt.figure(figsize=(18, 8))
    gs = gridspec.GridSpec(2, 3, figure=fig)
    # 获得每个子图的位置
    ax1 = fig.add_subplot(gs[0, 0])
    ax2 = fig.add_subplot(gs[0, 1])
    ax3 = fig.add_subplot(gs[0, 2])
    # ax4 = fig.add_subplot(gs[1, 0])
    # ax5 = fig.add_subplot(gs[1, 1])
    ax6 = fig.add_subplot(gs[1, 2])
    
    # 1-基础的多折线图
    df=pd.DataFrame({'x_values': range(1,11), 'y1_values': np.random.randn(10), 'y2_values': np.random.randn(10)+range(1,11), 'y3_values': np.random.randn(10)+range(11,21) })
    
    ax1.plot( 'x_values', 'y1_values', data=df, marker='o', markerfacecolor='blue', markersize=12, color='skyblue', linewidth=4)
    ax1.plot( 'x_values', 'y2_values', data=df, marker='', color='olive', linewidth=2)
    ax1.plot( 'x_values', 'y3_values', data=df, marker='', color='olive', linewidth=2, linestyle='dashed', label="toto")
    ax1.legend()
    ax1.set_title('基础的多折线图')
    
    
    
    # 2-高亮显示一组
    df=pd.DataFrame({'x': range(1,11), 'y1': np.random.randn(10), 'y2': np.random.randn(10)+range(1,11), 'y3': np.random.randn(10)+range(11,21), 'y4': np.random.randn(10)+range(6,16), 'y5': np.random.randn(10)+range(4,14)+(0,0,0,0,0,0,0,-3,-8,-6), 'y6': np.random.randn(10)+range(2,12), 'y7': np.random.randn(10)+range(5,15), 'y8': np.random.randn(10)+range(4,14) })
    
    for column in df.drop('x', axis=1):
        ax2.plot(df['x'], df[column], marker='', color='grey', linewidth=1, alpha=0.4)
    ax2.plot(df['x'], df['y5'], marker='', color='orange', linewidth=4, alpha=0.7) # 高亮y5
    ax2.set_xlim(0,12)
    # 增加注释
    num=0
    for i in df.values[9][1:]:
        num+=1
        name=list(df)[num]
        if name != 'y5':
            ax2.text(10.2, i, name, horizontalalignment='left', size='small', color='grey')
        else:
            ax2.text(10.2, i, 'Mr Orange', horizontalalignment='left', size='small', color='orange') # 高亮组的文本注释
    ax2.set_title("高亮显示一组")
    
    
    
    # 3-多折线模式(Spaghetti Plot)
    df=pd.DataFrame({'x': range(1,11), 'y1': np.random.randn(10), 'y2': np.random.randn(10)+range(1,11), 'y3': np.random.randn(10)+range(11,21), 'y4': np.random.randn(10)+range(6,16), 'y5': np.random.randn(10)+range(4,14)+(0,0,0,0,0,0,0,-3,-8,-6), 'y6': np.random.randn(10)+range(2,12), 'y7': np.random.randn(10)+range(5,15), 'y8': np.random.randn(10)+range(4,14), 'y9': np.random.randn(10)+range(4,14), 'y10': np.random.randn(10)+range(2,12) })
    
    palette = plt.get_cmap('Set1')
    num=0
    for column in df.drop('x', axis=1):
        num+=1
        ax3.plot(df['x'], df[column], marker='', color=palette(num), linewidth=1, alpha=0.9, label=column)
        
    ax3.legend(loc=2, ncol=2)
    ax3.set_title("多折线模式(Spaghetti Plot)")
    
    
    
    # 4-多折线小图
    df=pd.DataFrame({'x': range(1,11), 'y1': np.random.randn(10), 'y2': np.random.randn(10)+range(1,11), 'y3': np.random.randn(10)+range(11,21), 'y4': np.random.randn(10)+range(6,16), 'y5': np.random.randn(10)+range(4,14)+(0,0,0,0,0,0,0,-3,-8,-6), 'y6': np.random.randn(10)+range(2,12), 'y7': np.random.randn(10)+range(5,15), 'y8': np.random.randn(10)+range(4,14), 'y9': np.random.randn(10)+range(4,14) })
    # 在第一行第一列的位置创建3*3的子布局
    ax4 = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=gs[1, 0])
    # 在 3x3 的小布局中添加子图
    axes = []
    for i in range(3):
        for j in range(3):
            ax = fig.add_subplot(ax4[i, j])
            axes.append(ax)  # 将子图句柄添加到列表中
    num = 0
    for column in df.drop('x', axis=1):
        num += 1
    
        ax = axes[num - 1]
        ax.plot(df['x'], df[column], marker='', color=palette(num), linewidth=1.9, alpha=0.9, label=column)
        ax.set_xlim(0,10)
        ax.set_ylim(-2,22)
    
    
        # 如果当前子图不在最左边,就不显示y轴的刻度标签
        if num not in [1,4,7] :
            ax.tick_params(labelleft=False)
            
        # 如果当前子图不在最下边,就不显示x轴的刻度标签
        if num not in [7,8,9] :
            ax.tick_params(labelbottom=False)
            
        ax.annotate(column, xy=(0, 1), xycoords='axes fraction', fontsize=12, fontweight=0, color=palette(num),
                xytext=(5, -5), textcoords='offset points', ha='left', va='top')
        
    axes[1].set_title('多折线小图') # 通过设置3*3图的第二个子图的标题替代2*3图中的第4个图的子标题
        
        
    # 5-多折线小图细节处理
    df=pd.DataFrame({'x': range(1,11), 'y1': np.random.randn(10), 'y2': np.random.randn(10)+range(1,11), 'y3': np.random.randn(10)+range(11,21), 'y4': np.random.randn(10)+range(6,16), 'y5': np.random.randn(10)+range(4,14)+(0,0,0,0,0,0,0,-3,-8,-6), 'y6': np.random.randn(10)+range(2,12), 'y7': np.random.randn(10)+range(5,15), 'y8': np.random.randn(10)+range(4,14), 'y9': np.random.randn(10)+range(4,14) })
    # 在第一行第一列的位置创建3*3的子布局
    ax5 = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=gs[1, 1])
    # 在 3x3 的小布局中添加子图
    axes = []
    for i in range(3):
        for j in range(3):
            ax = fig.add_subplot(ax5[i, j])
            axes.append(ax)  # 将子图句柄添加到列表中
    num=0
    for column in df.drop('x', axis=1):
        num+=1
     
        ax = axes[num - 1]
        for v in df.drop('x', axis=1):
            ax.plot(df['x'], df[v], marker='', color='grey', linewidth=0.6, alpha=0.3)
     
        ax.plot(df['x'], df[column], marker='', color=palette(num), linewidth=2.4, alpha=0.9, label=column)
     
        ax.set_xlim(0,10)
        ax.set_ylim(-2,22)
     
         # 如果当前子图不在最左边,就不显示y轴的刻度标签
        if num not in [1,4,7] :
            ax.tick_params(labelleft=False)
            
        # 如果当前子图不在最下边,就不显示x轴的刻度标签
        if num not in [7,8,9] :
            ax.tick_params(labelbottom=False)
            
        ax.annotate(column, xy=(0, 1), xycoords='axes fraction', fontsize=12, fontweight=0, color=palette(num),
                xytext=(5, -5), textcoords='offset points', ha='left', va='top')
        
    axes[1].set_title('多折线小图细节处理') # 通过设置3*3图的第二个子图的标题替代2*3图中的第5个图的子标题
        
        
    # 6-带区域填充的多折线图
    time = np.arange(12)
    income = np.array([5, 9, 6, 6, 10, 7, 6, 4, 4, 5, 6, 4])
    expenses = np.array([6, 6, 8, 3, 6, 9, 7, 8, 6, 6, 4, 8])
    
    ax6.plot(time, income, color="green")
    ax6.plot(time, expenses, color="red")
    
    # 当income > expenses填充绿色
    ax6.fill_between(
        time, income, expenses, where=(income > expenses), 
        interpolate=True, color="green", alpha=0.25, 
        label="Positive"
    )
    
    # 当income <= expenses填充红色
    ax6.fill_between(
        time, income, expenses, where=(income <= expenses), 
        interpolate=True, color="red", alpha=0.25,
        label="Negative"
    )
    
    ax6.set_title('带区域填充的多折线图')
    ax6.legend()
    
    
    plt.tight_layout() # 自动调整间距
    plt.show()
    

    10

  6. 绘制时间序列图

    import matplotlib.pyplot as plt
    import pandas as pd
    import matplotlib.dates as mdates
    
    # 导入数据
    data = pd.read_csv(
        "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", 
        delim_whitespace=True
    )
    
    # 日期格式
    data["date"] = pd.to_datetime(data["date"])
    
    date = data["date"]
    value = data["value"]
    
    # 绘制时间序列图
    fig, ax = plt.subplots(figsize=(8, 6))
    
    # 设置6个月间隔为一刻度
    half_year_locator = mdates.MonthLocator(interval=6) # 半年刻度
    monthly_locator = mdates.MonthLocator() # 每月子刻度
    year_month_formatter = mdates.DateFormatter("%Y-%m") # 格式化日期yyyy-MM
    
    ax.xaxis.set_major_locator(half_year_locator)
    ax.xaxis.set_minor_locator(monthly_locator)
    ax.xaxis.set_major_formatter(year_month_formatter)
    
    ax.plot(date, value)
    
    fig.autofmt_xdate() # 自动旋转轴标签
    

    11

通过plotly绘制多样化的折线图

import plotly.graph_objects as go
import numpy as np
import pandas as pd

# 自定义数据

dates = []
start = 1990
end = 2022
for date in range(start,end):
    dates.append(str(date))
    
# 生成随机序列,并计算累计和来生成随机漫步1、2、3
random_steps = np.random.choice([-1, 1], size=end-start, p=[0.5, 0.5])
random_walk1 = np.cumsum(random_steps)

random_steps = np.random.choice([-1, 1], size=end-start, p=[0.5, 0.5])
random_walk2 = np.cumsum(random_steps)

random_steps = np.random.choice([-1, 1], size=end-start, p=[0.5, 0.5])
random_walk3 = np.cumsum(random_steps)

# 具有三个随机漫步的数据
df = pd.DataFrame({'date': dates,
                   'value1': random_walk1,
                   'value2': random_walk2,
                   'value3': random_walk3,})


fig = go.Figure()

# 自定义变量1
fig.add_trace(go.Scatter(
    x=df['date'],
    y=df['value1'],
    mode='lines+markers', # 点线连接样式
    name='Line1',
    
    marker=dict(
        symbol='square',    
        size=10,           
        color='red'),      
    
    line=dict(
        color='blue',        
        width=5)            
))

# 自定义变量2
fig.add_trace(go.Scatter(
    x=df['date'], 
    y=df['value2'], 
    mode='lines+markers', 
    name='Line2', 
    
    marker=dict(
        symbol='circle',   
        size=7,           
        color='purple'),      
    
    line=dict(
        color='orange',       
        width=8)            
))

# 自定义变量3
fig.add_trace(go.Scatter(
    x=df['date'], 
    y=df['value3'], 
    mode='lines+markers', 
    name='Line3',
    
    marker=dict(
        symbol='diamond',    
        size=15,            
        color='yellow'),       
    
    line=dict(
        color='green',       
        width=4)             
))

# 自定义布局
fig.update_layout(
    title='Customized Line Chart',
    xaxis_title='X Axis Label', 
    yaxis_title='Y Axis Label',
    xaxis_tickangle=45,  
    showlegend=True,    
    plot_bgcolor='white',  
    paper_bgcolor='lightblue', 
)

12

通过pandas绘制多样化的折线图

  1. 修改参数

    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    # 导入数据
    url = 'https://raw.githubusercontent.com/holtzy/The-Python-Graph-Gallery/master/static/data/gapminderData.csv'
    df = pd.read_csv(url)
    df_france = df[df['country']=='France']
    
    
    # 绘制折线图
    ax = df_france.plot(x='year',
                        y='lifeExp',
                        grid=True,
                        linestyle='--',
                        alpha=0.5,
                        color='purple',
                        linewidth=2.0, 
                        marker='d',  
                        markersize=8,  
                        markerfacecolor='orange', 
                        label='France'
                       )
    
    # 标题
    ax.set_title('Evolution of \nthe life expectancy in France',
                 weight='bold') 
    
    # 轴标签
    ax.set_ylabel('Life Expectancy')
    ax.set_xlabel('Time (in year)')
    
    
    plt.show()
    

    13

  2. 多变量折线图

    import pandas as pd
    import random, numpy as np
    import matplotlib.pyplot as plt
    
    # 自定义数据
    num_time_points = 100
    time_values = np.arange(num_time_points)
    
    temperature = np.random.uniform(200, 400, num_time_points) 
    pressure = np.random.uniform(500, 700, num_time_points) 
    humidity = np.random.uniform(800, 1000, num_time_points) 
    
    data = {
        'Time': time_values,
        'Temperature': temperature,
        'Pressure': pressure,
        'Humidity': humidity
    }
    df = pd.DataFrame(data)
    
    # 绘制多变量折线图
    df.plot(x='Time',
            kind='line', 
            grid=True, 
            )
    plt.legend(loc='upper right',
               bbox_to_anchor=(1.35, 1), 
              )
    plt.show()
    

    14

  3. 分组折线图

    import pandas as pd
    import random, numpy as np
    import matplotlib.pyplot as plt
    
    # 自定义数据
    num_data_points_per_country = 20
    
    # 设置多个国家的温度
    france_temperatures = np.random.uniform(10, 20, num_data_points_per_country)  
    germany_temperatures = np.random.uniform(0, 10, num_data_points_per_country) 
    italy_temperatures = np.random.uniform(25, 30, num_data_points_per_country) 
    
    # 对应的国家数据
    countries = ['France', 'Germany', 'Italy']
    country_labels = np.repeat(countries, num_data_points_per_country)
    
    # 时间数据
    time_values = np.tile(np.arange(num_data_points_per_country), len(countries))
    
    data = {
        'Country': country_labels,
        'Temperature': np.concatenate([france_temperatures, germany_temperatures, italy_temperatures]),
        'Time': time_values
    }
    
    df = pd.DataFrame(data)
    
    
    # 绘制折线图
    for name, group in df.groupby('Country'):
        plt.plot(group['Time'], group['Temperature'], label=name)
    
    # 设置图表的标题和坐标轴标签,并显示图例
    plt.title('Temperature Trend over Time by Country')
    plt.xlabel('Time')
    plt.ylabel('Temperature')
    plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
    
    # 显示图表
    plt.show()
    

    15

总结

以上通过matplotlib、seaborn、plotly和pandas快速绘制折线图。并通过修改参数或者辅以其他绘图知识自定义各种各样的折线图来适应相关使用场景。

共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始在Windows系统上搭建一个node.js后端服务项目

目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon&#xff0c;实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程&#xff0c;此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

微信小程序应用echarts和二维表的结合

1.刚进入页面时&#xff0c;小馋猫图片的位置是由echarts图表的&#xff0c;这个你别管&#xff0c;我有我的难处&#xff0c;是由二维表组成的 当滑动鼠标时&#xff0c;会出现这种情况&#xff0c;echarts图表随着鼠标滑动&#xff0c;位置不固定 3.解决问题&#xff0c;因为…

用manim实现内燃机引擎的活塞,连杆和曲柄的模拟运动【上】

一&#xff0c;介绍 内燃机引擎是现代机械设备中一种非常重要的动力装置&#xff0c;其核心部件包括活塞、连杆和曲柄。活塞在气缸内做往复运动&#xff0c;通过连杆与曲柄相连&#xff0c;将往复运动转化为旋转运动&#xff0c;驱动机械设备正常工作。 活塞是内燃机引擎的关键…

VSCode中的TypeScript教程

TypeScript 是JavaScript的类型化超集&#xff0c;可编译为纯JavaScript。它提供了类、模块和接口来帮助您构建健壮的组件。 安装 TypeScript 编译器 Visual Studio Code 包括 TypeScript 语言支持&#xff0c;但不包括 TypeScript 编译器tsc。您需要在全局或工作区中安装Typ…

【C语言】预编译+编译+汇编+链接

文章目录 翻译环境和运行环境翻译环境预处理&#xff08;预编译&#xff09;编译汇编链接 运行环境 接下来是预处理阶段的一系列知识&#xff0c;认真阅读哦预定义符号#define定义常量#define定义宏带有副作用的宏参数宏替换的规则宏函数的对比#和##命名约定#undef命令行定义条…

C++初阶(五)--类和对象(中)--默认成员函数

目录 一、默认成员函数&#xff08;Default Member Functions&#xff09; 二、构造函数&#xff08; Constructor&#xff09; 1.构造函数的基本概念 2.构造函数的特征 3.构造函数的使用 无参构造函数 和 带参构造函数 注意事项&#xff1a; 4.默认构造函数 隐式生成的…

恢复已删除文件的 10 种安卓数据恢复工具

由于我们现在在智能手机上存储了大量重要文件&#xff0c;因此了解数据恢复工具变得很重要。您永远不会知道什么时候需要使用 安卓 数据恢复工具。 由于不乏 Windows 数据恢复工具&#xff0c;因此从崩溃的计算机中恢复文件很容易。但是&#xff0c;当涉及到从 安卓恢复数据时…

大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案&#xff0c;这一篇文章…

unity学习-全局光照(GI)

在全局光照&#xff08;Lighting&#xff09;界面有两个选项 Realtime Light&#xff08;实时光照&#xff09;&#xff1a;在项目中会提前计算好光照以及阴影的程序&#xff0c;当你需要调用实时全局光照的时候会将程序调用出来使用 Mixed Light&#xff08;烘焙光照&#x…

如何利用kafka实现高效数据同步?

在我们之前的文章有详细介绍过Kafka的结构、特点和处理方式。具备告诉处理能力的kafka被利用在数据同步和数据传输上&#xff0c;今天来说下kafka是怎么实现高效的数据同步和传输。 一、可靠的数据传输 1. 持久性保证&#xff1a;Kafka 将数据持久化到磁盘上&#xff0c;即使在…

汽车管理系统——主界面制作

目录 主界面需要有什么&#xff1f;然后要做什么&#xff1f;添加两个主菜单&#xff08;声明&#xff09;下一步应该干什么&#xff1f;能够跳转到文件有哪几个动作&#xff1f;动作如何声明&#xff1f;为什么用选择声明指针&#xff0c;不选择直接声明这个对象&#xff1f; …

算力基础篇:从零开始了解算力

什么是算力 算力即计算能力&#xff08;Computing Power&#xff09;&#xff0c;狭义上指对数字问题的运算能力&#xff0c;而广义上指对输入信息处理后实现结果输出的一种能力。虽然处理的内容不同&#xff0c;但处理过程的能力都可抽象为算力。比如人类大脑、手机以及各类服…

git 与 github 同步

1.配置账户 git config --global user.name "你的用户名" git config --global user.email "你的邮箱" 2.输入命令创建ssh key $ ssh-keygen -t rsa -C "邮箱" //你自己注册GitHub的邮箱 输入命令之后提示输入密码&#xff0c;回车直到出现…

C++类(3)

1.如果一个类什么成员都没有&#xff0c;简称空类 但是空类真的什么都没有吗&#xff1f; 并不是&#xff0c;任何类什么都不写&#xff0c;编译器会自动生成以下6个默认成员函数 1.构造函数 class Date { public:void Init(int year, int month, int day){_year year;_mo…

kubernetes简介及安装部署

目录 一、kubernetes简介 1、k8s的概念 2、k8s各个组件及用途 3、k8s各组件之间的调用关系 4、k8s常用名词概念 5、k8s的分层架构 二、kubernetes安装部署 1、k8s集群环境搭建 2、本地解析、swap禁用 3、安装docker 4、复制harbor仓库中的证书并启动docker 5、设定d…

基于Cesium.js的可视化大屏,效果绝对的震撼!

基于 Cesium.js 的可视化大屏确实能带来震撼的效果。Cesium.js 强大的三维渲染能力&#xff0c;能够逼真地呈现地理信息和各种数据模型。 在大屏上&#xff0c;广袤的地形地貌、精细的建筑模型以及动态的数据展示&#xff0c;仿佛将观众带入一个全新的虚拟世界。无论是用于地理…

网络分析仪——提升网络性能的关键工具

目录 什么是网络分析仪&#xff1f; 1. 实时流量监控 2. 历史数据回溯分析 3. 网络性能关键指标监测 4. 可视化界面与报告生成 总结 在当今的数字化世界&#xff0c;网络的稳定性和性能直接影响企业的运营效率。网络拥堵、延迟和丢包等问题会导致用户体验的下降&#xff…

“屏” 步青云:轻松开启录屏功能,Windows 实例教学

你知道 Windows 的录屏功能怎么打开吗&#xff1f;在当今数字化时代&#xff0c;录屏功能成为了许多人工作、学习和娱乐中的得力助手。无论是制作教学视频、记录游戏精彩瞬间&#xff0c;还是为线上会议留存资料&#xff0c;掌握录屏技能都至关重要。今天我们不仅会介绍 Window…