Skip to content

Chart Output

Generate visual charts (PNG or SVG) from query results.

Usage

bash
loq -o:CHART -chartType:Bar --ofile:chart.png "SELECT category, COUNT(*) FROM data.csv GROUP BY category"

Requirements

  • --ofile: Output file path (required)
  • File extension determines format: .png or .svg

Chart Types

Bar Chart

Vertical bar chart for comparing categories.

bash
loq -o:CHART -chartType:Bar --ofile:chart.png \
          "SELECT status, COUNT(*) FROM logs.csv GROUP BY status"

Best for:

  • Comparing discrete categories
  • Showing counts, totals, or averages
  • 2-20 categories

Line Chart

Line chart for trends and time series.

bash
loq -o:CHART -chartType:Line --ofile:trend.png \
          "SELECT date, COUNT(*) FROM logs.csv GROUP BY date ORDER BY date"

Best for:

  • Time series data
  • Trends over ordered sequences
  • Continuous data

Pie Chart

Pie chart for proportions.

bash
loq -o:CHART -chartType:Pie --ofile:distribution.png \
          "SELECT category, SUM(amount) FROM sales.csv GROUP BY category"

Best for:

  • Part-to-whole relationships
  • Percentage breakdowns
  • 3-8 categories (more becomes unreadable)

Options

Chart Type

bash
-chartType:Bar    # Vertical bar chart (default)
-chartType:Line   # Line chart
-chartType:Pie    # Pie chart

Chart Title

bash
-chartTitle:"My Chart Title"
bash
loq -o:CHART -chartType:Bar -chartTitle:"HTTP Status Codes" \
          --ofile:status.png \
          "SELECT status, COUNT(*) FROM access.log GROUP BY status"

Output Format

Determined by file extension:

bash
--ofile:chart.png   # PNG (raster)
--ofile:chart.svg   # SVG (vector)

Data Requirements

Column Requirements

Charts require at least 2 columns:

  1. First column: Labels/categories (X-axis or slice labels)
  2. Second column: Numeric values (Y-axis or slice sizes)
sql
-- Correct: 2 columns
SELECT category, COUNT(*) FROM data.csv GROUP BY category

-- Incorrect: 1 column
SELECT COUNT(*) FROM data.csv

Numeric Values

The second column must be numeric:

sql
-- Good
SELECT name, age FROM users.csv

-- Bad (second column is string)
SELECT name, city FROM users.csv

Examples

HTTP Status Code Distribution

bash
loq -o:CHART -chartType:Bar \
          -chartTitle:"HTTP Status Codes" \
          --ofile:status_codes.png \
          "SELECT sc-status, COUNT(*) FROM access.log GROUP BY sc-status"

Requests Over Time

bash
loq -o:CHART -chartType:Line \
          -chartTitle:"Hourly Request Volume" \
          --ofile:hourly_requests.png \
          "SELECT SUBSTR(time, 1, 2) AS hour, COUNT(*)
           FROM access.log
           GROUP BY hour
           ORDER BY hour"

Traffic by User Agent

bash
loq -o:CHART -chartType:Pie \
          -chartTitle:"Traffic by Browser" \
          --ofile:browsers.svg \
          "SELECT cs(User-Agent), COUNT(*) AS requests
           FROM access.log
           GROUP BY cs(User-Agent)
           ORDER BY requests DESC
           LIMIT 5"

Error Trend

bash
loq -o:CHART -chartType:Line \
          -chartTitle:"Daily Error Count" \
          --ofile:error_trend.png \
          "SELECT date, COUNT(*)
           FROM logs.csv
           WHERE level = 'error'
           GROUP BY date
           ORDER BY date"

Top Endpoints by Response Time

bash
loq -o:CHART -chartType:Bar \
          -chartTitle:"Slowest Endpoints (Avg Response Time)" \
          --ofile:slow_endpoints.png \
          "SELECT cs-uri-stem, AVG(time-taken)
           FROM access.log
           GROUP BY cs-uri-stem
           ORDER BY AVG(time-taken) DESC
           LIMIT 10"

Bandwidth by Path

bash
loq -o:CHART -chartType:Pie \
          -chartTitle:"Bandwidth Usage by Path" \
          --ofile:bandwidth.png \
          "SELECT cs-uri-stem, SUM(sc-bytes) AS bytes
           FROM access.log
           GROUP BY cs-uri-stem
           ORDER BY bytes DESC
           LIMIT 8"

PNG vs SVG

FeaturePNGSVG
FormatRaster (pixels)Vector (paths)
ScalingPixelated when enlargedCrisp at any size
File sizeLarger for complex chartsSmaller usually
Best forWeb, documentsPrint, presentations
EditableNoYes (in vector editors)

When to Use PNG

  • Embedding in documents
  • Web display at fixed size
  • Quick previews

When to Use SVG

  • Presentations (scales to screen)
  • Print materials
  • Further editing needed
  • Responsive web design

Best Practices

Use LIMIT for Readability

Too many categories make charts unreadable:

bash
# Good: Top 10
SELECT category, COUNT(*) FROM data.csv GROUP BY category ORDER BY COUNT(*) DESC LIMIT 10

# Bad: All categories (might be hundreds)
SELECT category, COUNT(*) FROM data.csv GROUP BY category

Order Data Appropriately

Bar charts: Order by value for impact

sql
ORDER BY COUNT(*) DESC

Line charts: Order by X-axis value

sql
ORDER BY date ASC

Use Meaningful Titles

bash
-chartTitle:"Daily Active Users (January 2024)"

Choose Right Chart Type

Data TypeRecommended Chart
Categories (unordered)Bar
Time seriesLine
ProportionsPie
RankingsBar (horizontal ideal)
TrendsLine
ComparisonsBar

Troubleshooting

"CHART format requires at least 2 columns"

Ensure query returns 2+ columns:

sql
-- Fix: add value column
SELECT status, COUNT(*) FROM logs.csv GROUP BY status

"Cannot convert to number"

Second column must be numeric:

sql
-- Fix: use aggregate or numeric column
SELECT category, SUM(amount) FROM sales.csv GROUP BY category

Chart Too Crowded

Use LIMIT to reduce categories:

sql
SELECT category, COUNT(*) FROM data.csv
GROUP BY category
ORDER BY COUNT(*) DESC
LIMIT 10

Empty Chart

Verify query returns data:

bash
# Check data first
loq -o:CSV "SELECT status, COUNT(*) FROM logs.csv GROUP BY status"

Combining with Reports

Generate Multiple Charts

bash
# Status code distribution
loq -o:CHART -chartType:Bar --ofile:charts/status.png \
          "SELECT sc-status, COUNT(*) FROM access.log GROUP BY sc-status"

# Hourly traffic
loq -o:CHART -chartType:Line --ofile:charts/hourly.png \
          "SELECT SUBSTR(time,1,2) AS hour, COUNT(*) FROM access.log GROUP BY hour ORDER BY hour"

# Top URLs
loq -o:CHART -chartType:Bar --ofile:charts/top_urls.png \
          "SELECT cs-uri-stem, COUNT(*) FROM access.log GROUP BY cs-uri-stem ORDER BY COUNT(*) DESC LIMIT 10"

Export Data and Chart

bash
# Export data
loq -o:CSV --ofile:data.csv "SELECT status, COUNT(*) FROM logs.csv GROUP BY status"

# Create chart
loq -o:CHART -chartType:Bar --ofile:chart.png "SELECT * FROM data.csv"

See Also

All rights reserved.