AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79585301
Accepted
andrey
andrey
Asked: 2025-04-22 04:34:31 +0800 CST2025-04-22 04:34:31 +0800 CST 2025-04-22 04:34:31 +0800 CST

As linhas da grade vertical do Matplotlib não correspondem aos pontos

  • 772

Você poderia explicar por que as linhas de grade verticais não correspondem aos pontos?

insira a descrição da imagem aqui

Aqui estão meus dados para o gráfico:

{datetime.datetime(2025, 4, 15, 19, 23, 50, 658000, tzinfo=datetime.timezone.utc): 68,0, datetime.datetime(2025, 4, 16, 19, 31, 1, 367000, tzinfo=datetime.timezone.utc): 72,0, datetime.datetime(2025, 4, 17, 19, 34, 21, 507000, tzinfo=datetime.timezone.utc): 75,0, datetime.datetime(2025, 4, 18, 19, 50, 28, 446000, tzinfo=datetime.timezone.utc): 80,0, datetime.datetime(2025, 4, 19, 19, 57, 15, 393000, tzinfo=datetime.timezone.utc): 78,0, datetime.datetime(2025, 4, 20, 19, 57, 49, 60000, tzinfo=datetime.timezone.utc): 77,0, datetime.datetime(2025, 4, 21, 20, 28, 51, 127710, tzinfo=datetime.timezone.utc): 73,0}

E aqui está meu código:

    fig, ax = plt.subplots(figsize=(12, 6))

    ax.plot(df['Дата'], df['Вес'], marker='o', linestyle='-', color='royalblue', label='Вес')

    ax.scatter(df['Дата'], df['Вес'], color='red', zorder=5)

    ax.set_title('График изменения веса по дням', fontsize=16)
    ax.set_xlabel('Дата', fontsize=12)
    ax.set_ylabel('Вес (кг)', fontsize=12)
    ax.xaxis.set_major_locator(mdates.AutoDateLocator())  # Раз в день

    ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%Y'))

    plt.setp(ax.xaxis.get_majorticklabels(), rotation=45, ha="right")

    ax.grid(True, linestyle='--', alpha=0.6)

    plt.tight_layout()
python
  • 1 1 respostas
  • 57 Views

1 respostas

  • Voted
  1. Best Answer
    Subir Chowdhury
    2025-04-22T10:07:30+08:002025-04-22T10:07:30+08:00

    Existem várias soluções para isso.

    Acho que usar ax.set_xticks(df['Дата']) "para forçar os ticks a corresponderem às suas datas e horas reais" pode ser melhor para você quando a hora do dia importa, não apenas a data.

    O código completo:

    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import pandas as pd
    from datetime import datetime, timezone
    
    data = {
        datetime(2025, 4, 15, 19, 23, 50, 658000, tzinfo=timezone.utc): 68.0,
        datetime(2025, 4, 16, 19, 31, 1, 367000, tzinfo=timezone.utc): 72.0,
        datetime(2025, 4, 17, 19, 34, 21, 507000, tzinfo=timezone.utc): 75.0,
        datetime(2025, 4, 18, 19, 50, 28, 446000, tzinfo=timezone.utc): 80.0,
        datetime(2025, 4, 19, 19, 57, 15, 393000, tzinfo=timezone.utc): 78.0,
        datetime(2025, 4, 20, 19, 57, 49, 60000, tzinfo=timezone.utc): 77.0,
        datetime(2025, 4, 21, 20, 28, 51, 127710, tzinfo=timezone.utc): 73.0
    }
    
    df = pd.DataFrame(list(data.items()), columns=['Дата', 'Вес'])
    
    fig, ax = plt.subplots(figsize=(12, 6), layout='constrained')
    
    ax.plot(df['Дата'], df['Вес'], 
            marker='o', 
            markersize=8,
            markerfacecolor='red',
            markeredgecolor='white',
            markeredgewidth=1.5,
            linestyle='-', 
            linewidth=2,
            color='royalblue', 
            label='Вес')
    
    ax.set_xticks(df['Дата'])
    
    date_fmt = mdates.DateFormatter('%d.%m.%Y\n%H:%M')
    ax.xaxis.set_major_formatter(date_fmt)
    
    ax.grid(True, 
            which='major',
            linestyle='--', 
            linewidth=0.7,
            alpha=0.7)
    
    ax.set_title('График изменения веса по дням', fontsize=16, pad=20)
    ax.set_xlabel('Дата и время измерения', fontsize=12, labelpad=10)
    ax.set_ylabel('Вес (кг)', fontsize=12, labelpad=10)
    
    ax.tick_params(axis='x', which='major', rotation=45, labelsize=10)
    
    fig.autofmt_xdate(ha='center', bottom=0.2)
    
    plt.show()
    

    Outra solução é "normalizar a data e hora para meia-noite" usando df['Дата'] = df['Дата'].dt.normalize(). Pode ser melhor quando o tempo não for necessário. Você está traçando tendências diárias.

    O código completo:

    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import pandas as pd
    import datetime
    
    data = {
        datetime.datetime(2025, 4, 15, 19, 23, 50, 658000, tzinfo=datetime.timezone.utc): 68.0,
        datetime.datetime(2025, 4, 16, 19, 31, 1, 367000, tzinfo=datetime.timezone.utc): 72.0,
        datetime.datetime(2025, 4, 17, 19, 34, 21, 507000, tzinfo=datetime.timezone.utc): 75.0,
        datetime.datetime(2025, 4, 18, 19, 50, 28, 446000, tzinfo=datetime.timezone.utc): 80.0,
        datetime.datetime(2025, 4, 19, 19, 57, 15, 393000, tzinfo=datetime.timezone.utc): 78.0,
        datetime.datetime(2025, 4, 20, 19, 57, 49, 60000, tzinfo=datetime.timezone.utc): 77.0,
        datetime.datetime(2025, 4, 21, 20, 28, 51, 127710, tzinfo=datetime.timezone.utc): 73.0,
    }
    
    df = pd.DataFrame(list(data.items()), columns=["Дата", "Вес"])
    df['Дата'] = df['Дата'].dt.tz_convert(None).dt.normalize()
    
    fig, ax = plt.subplots(figsize=(12, 6))
    ax.plot(df['Дата'], df['Вес'], marker='o', linestyle='-', color='royalblue', label='Вес')
    ax.scatter(df['Дата'], df['Вес'], color='red', zorder=5)
    
    ax.set_title('График изменения веса по дням', fontsize=16)
    ax.set_xlabel('Дата', fontsize=12)
    ax.set_ylabel('Вес (кг)', fontsize=12)
    
    ax.xaxis.set_major_locator(mdates.DayLocator())
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%d.%m.%Y'))
    
    plt.setp(ax.xaxis.get_majorticklabels(), rotation=45, ha="right")
    
    ax.grid(True, linestyle='--', alpha=0.6)
    plt.tight_layout()
    plt.show()
    

    Se nenhuma das soluções funcionar para você, informe-me e tentarei fornecer outra solução.

    Saída:

    insira a descrição da imagem aqui

    • 3

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve