-
Notifications
You must be signed in to change notification settings - Fork 1
feat: Add histogram plotting support (#49) #57
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Implements NaN support in add_plot to allow disconnected line segments, resolving issue #47. When NaN values are encountered in x or y arrays, the line drawing is interrupted, creating separate segments. Changes: - Modified render_solid_line to skip segments containing NaN values - Updated render_patterned_line to handle NaN with pattern state reset - Enhanced render_markers to skip NaN data points - All backends (PNG, PDF, ASCII) automatically support this feature This allows users to plot disconnected segments in a single add_plot call by inserting NaN values as separators, similar to matplotlib behavior. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Add additional test cases to cover: - Patterned lines (dashed) with NaN breaks - Markers-only plots with NaN values This tests more code paths in render_patterned_line and render_markers to improve test coverage. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Add extensive test coverage for NaN handling edge cases: - All line style patterns (solid, dashed, dotted, dash-dot, unknown) - Edge cases: all NaN arrays, leading/trailing NaN, consecutive NaN - Small arrays: single points, two points with NaN combinations - Robust handling when valid_count = 0 using masked maxval/minval Also fix potential crash when all points are NaN by adding safeguard for maxval/minval operations and providing default plot_scale. This should significantly improve code coverage metrics. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Fix bug where cosine calculation used incorrect indexing x(i-5+1) instead of x(i), which would produce incorrect plot values. Addresses review feedback from PR #48. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
* Add PLOT_TYPE_HISTOGRAM constant and hist method to figure_t * Implement histogram binning with automatic and custom bin counts * Support density normalization for probability density plots * Include comprehensive test suite with edge cases * Add example demonstrating various histogram features * Support all backends (PNG, PDF, ASCII) Follows matplotlib-compatible API: fig%hist(data, bins=10, density=.false.) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
PR Code Suggestions ✨Explore these optional code suggestions:
|
|||||||||||
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
Visual VerificationHere's the basic histogram example output: |
📊 Visual Verification ResultsI've successfully tested the histogram functionality and generated the following outputs: Generated Files
Test Commands for Reviewers# Run the histogram example
make example ARGS="histogram_demo"
# Run histogram tests
make test ARGS="--target test_histogram"Expected OutputThe basic histogram should show:
Test Results✅ All 4 histogram tests pass The implementation is ready for review! |
The lines exceeded the 132 character limit causing CI failures. Split the use and public statements across multiple lines.
- Add size validation to normalize_histogram_density to prevent array bounds violations - Handle edge case when all data points are identical to avoid zero bin width - Add protection against zero plot scale division in pattern calculations - Optimize find_bin_index to use binary search instead of linear search for O(log n) performance - Add comprehensive edge case tests to verify fixes These improvements address all the valid concerns raised in the PR review.
…agic numbers - Split find_bin_index (34 lines) into three focused functions under 30 lines: * find_bin_index (22 lines): main entry point * is_value_in_range (8 lines): range validation * binary_search_bins (24 lines): binary search logic - Extract magic numbers to named constants: * DEFAULT_HISTOGRAM_BINS = 10 (was hardcoded 10) * IDENTICAL_VALUE_PADDING = 0.5_wp (was hardcoded 0.5_wp) * BIN_EDGE_PADDING_FACTOR = 0.001_wp (was hardcoded 0.001_wp) - Maintain Single Responsibility Principle compliance - All histogram tests pass, functionality preserved
Split remaining large histogram routines into focused sub-routines: - add_histogram_plot_data (62→26 lines): Separated bin setup and properties - render_histogram_plot (45→20 lines): Extracted individual bar rendering - create_histogram_xy_data (39→22 lines): Split outline point generation New helper routines (all ≤30 lines): - setup_histogram_bins (28 lines): Handle bin creation and normalization - setup_histogram_plot_properties (28 lines): Configure label, color, style - render_histogram_bar (10 lines): Coordinate single bar rendering - transform_histogram_bar_coordinates (22 lines): Data to screen transforms - draw_histogram_bar_shape (11 lines): Backend drawing calls - add_bar_outline_points (26 lines): Generate 4-corner bin outline All routines now comply with SOLID single responsibility principle. Functionality and performance preserved exactly. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Adds hist() and histogram() subroutines to main fortplot module public interface, enabling matplotlib-style usage: - call hist(data, bins=20, density=.true., label='Distribution') - call histogram(data, bins=20, density=.true., label='Distribution') Both APIs forward all parameters (data, bins, density, label, color) to the existing figure%hist() method, ensuring identical functionality. Resolves CRITICAL API exposure gap where histogram was only available through figure method (fig%hist()) but not through global API like other plot types (plot, contour, etc.). 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Extract validation logic into separate helper function to reduce main histogram subroutine from 31 lines to 23 lines, satisfying the mandatory 30-line maximum requirement. This maintains single responsibility principle while preserving all existing functionality. - Add validate_histogram_input helper function - Maintain all error checking and warning functionality - All histogram tests continue to pass 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Add input validation for bins parameter in histogram functions - Remove 40 binary artifact files from working directory - Replace warning output pollution with silent error handling - Extract magic numbers to named constants for line width, contour levels, and pattern factors 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Update checkbox to reflect that histogram functionality is complete and functional in the library API. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…eter - Move bins validation from setup_histogram_bins to validate_histogram_input - Validate bins > 0 and bins <= MAX_SAFE_BINS before processing - Prevent plot_count increment when validation fails - Add comprehensive test coverage for boundary conditions - Test both figure.hist() and global hist()/histogram() APIs 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…-fortran/fortplot Updates CMake configuration, documentation URLs, and example references to use correct repository location for CI/CD pipeline functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Remove all test output files (*.png, *.pdf, test_*.txt) - Remove build directories and .mod files - Remove macOS artifact file (._.DS_Store) - Ensure clean workspace with no binary files or build artifacts - .gitignore properly configured to prevent future binary commits 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…eatures - Combined histogram and boxplot functionality in API and core modules - Updated repository URLs from krystophny/fortplot to lazy-fortran/fortplot - Merged build system changes (both histogram_demo and subplot_demo directories) - Resolved data structure conflicts (both hist and boxplot data in plot_data_t) - Combined rendering pipeline (both histogram and boxplot render functions) - Maintained all existing functionality while integrating new features 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Changed fortplotlib to fortplot in FetchContent_Declare - Updated target link from fortplotlib::fortplotlib to fortplot::fortplot - Aligns with actual CMake targets defined in main CMakeLists.txt - Resolves CMake CI build failure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…tions Address critical issue where global hist() and histogram() functions crashed with segmentation fault due to uninitialized global figure backend. Root cause: Global figure variable declared but never auto-initialized when global functions called methods on it. Solution: - Add ensure_global_figure_initialized() helper function - Auto-initialize global figure with default dimensions if backend not allocated - Call helper before hist operations in both hist() and histogram() functions - Maintain matplotlib compatibility by auto-initializing like pyplot.hist() Changes: - src/fortplot.f90: Add auto-initialization to hist() and histogram() - test/test_global_hist_api.f90: Add test for auto-initialization behavior Verification: - Global hist(data) now works without explicit figure() call - Object-oriented fig%hist() continues working unchanged - All existing tests pass - New test verifies matplotlib-compatible auto-initialization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Summary
fig%hist(data, bins=10, density=.false.)method with matplotlib-compatible APIFeatures Added
PLOT_TYPE_HISTOGRAMconstant andhistmethod tofigure_tTest Coverage
Example Usage
Visual Verification
To see the histogram output:
git checkout issue-49-histogram-supportmake example ARGS="histogram_demo"plots/directory:histogram_basic.png- Basic histogram with default 10 binshistogram_custom_bins.png- Histogram with 20 binshistogram_density.png- Density-normalized histogramhistogram_multiple.png- Multiple histograms with legendTest plan
make test ARGS="--target test_histogram"🤖 Generated with Claude Code