Bar chart made in Python was "weird". Any suggestions on how to improve it?

2

Friends,

The following graphic was generated:

Thecodeusedwasasfollows:

#-*-coding:utf-8-*-importmatplotlib.pyplotaspltimportmatplotlib.datesasdatesfromdatetimeimportdatetime,timedeltax=[]y=[]withopen("dataset_semAtaques__10Abril2017_1min.csv") as f:
    for l in f:
        X,Y = l.split(",") #separador eh a virgula
        x.append(float(X))
        y.append(float (Y))

x1 = [datetime.fromtimestamp(int(d)) for d in x]
y_pos = [idx for idx, i in enumerate(y)]

plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%m/%d/%Y %H:%M:%S'))

y1 = []
v = 0
y_sorted = sorted(y)
for i in y_sorted:
    if(abs(i-v > 50)):
        y1.append(i)
        v = i

plt.bar(y_pos, y, align='edge', color="blue", alpha=0.5, width=0.5) # <--- EDICAO PRINCIPAL

plt.title("Número de Conexões por segundo: Sem Ataques")
plt.ylabel("Número de Conexões por segundo")
plt.xlabel('Tempo')
plt.xticks(y_pos, x1, size='small',rotation=35, ha="right")
plt.yticks(y1)
plt.ylim(ymin=y_sorted[0]-200) # valor minimo do eixo y

plt.show()

The bar chart looks very strange.

Any suggestions on how to best present the chart with the data below?

The data file (CSV) is available at: link

    
asked by anonymous 22.08.2017 / 16:54

1 answer

3

The problem is the range you had for the axis of y , n-200 as the minimum value, and it would be negative since the width of your values is in the range 0 <= y < 10 .

This works well, tested with python3.5:

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import matplotlib.dates as dates
from datetime import datetime, timedelta

x = []
y = []
with open("dataset_semataques__10abril2017_1min.csv") as f:
    for l in f:
        X,Y = l.split(",") #separador eh a virgula
        x.append(float(X))
        y.append(float (Y))

x1 = [datetime.fromtimestamp(int(d)) for d in x]
y_pos = [idx for idx, i in enumerate(y)]

plt.figure(figsize=(17,9))
plt.gca().xaxis.set_major_formatter(dates.DateFormatter('%m/%d/%Y %H:%M:%S'))

plt.bar(y_pos, y, align='edge', color="blue", alpha=0.5, width=0.5) # <--- EDICAO PRINCIPAL
plt.title("Número de Conexões por segundo: Sem Ataques")
plt.ylabel("Número de Conexões por segundo")
plt.xlabel('Tempo')
plt.xticks(y_pos, x1, size='small',rotation=35, ha="right")
plt.yticks(y)
plt.ylim(ymax=max(y)+1) # valor maximo do eixo y
#plt.ylim(ymin=min(y)-1) # valor minimo do eixo y

plt.show()
    
22.08.2017 / 20:17