Colorscales in templates are not valid list of lists, which breaks `plotly.colors.sample_colorscale`
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 18.8k
- Fork
- 2.8k
- Merge trung bình
- 16 giờ 26 phút
- Pull request đã merge (30 ngày)
- 21
Mô tả
Hello! I have something which is maybe a bug. It's certainly how I expected plotly.py to work, although maybe it's just a known limitation of how layout templates work.
Plotly comes with various colorscales built in, which work great:
import plotly
rainbow = plotly.colors.get_colorscale("rainbow")
# gives
[[0.0, 'rgb(150,0,90)'],
[0.125, 'rgb(0,0,200)'],
[0.25, 'rgb(0,25,255)'],
[0.375, 'rgb(0,152,255)'],
[0.5, 'rgb(44,255,150)'],
[0.625, 'rgb(151,255,0)'],
[0.75, 'rgb(255,234,0)'],
[0.875, 'rgb(255,111,0)'],
[1.0, 'rgb(255,0,0)']]
This is a list of lists and works as expected: plotly.colors.validate_colorscale(rainbow) passes.
Now I'd like to extract the colorscale from a template. This where things don't work as expected:
diverging = plotly.io.templates["plotly"].layout.colorscale.diverging
# gives
((0, '#8e0152'),
(0.1, '#c51b7d'),
(0.2, '#de77ae'),
(0.3, '#f1b6da'),
(0.4, '#fde0ef'),
(0.5, '#f7f7f7'),
(0.6, '#e6f5d0'),
(0.7, '#b8e186'),
(0.8, '#7fbc41'),
(0.9, '#4d9221'),
(1, '#276419'))
This is a tuple of tuples and does not pass plotly.colors.validate_colorscale(diverging), which raises:
_plotly_utils.exceptions.PlotlyError: A valid colorscale must be a list.
It's easy to convert this into a valid colorscale as diverging = [list(x) for x in diverging] but it seems strange that this is necessary.
Should the colorscale coming from a template be a list of lists already? Or should validate_colorscale accept tuple of tuples as valid? The real reason this matters is because plotly.colors.sample_colorscale runs validate_colorscale under the hood, which raises an error and means that sample_colorscale doesn't work.
Side note
AFAICT there's no way register a new colorscale in plotly other than through a template. plotly.colors.named_colorscales comes from _plotly_utils.basevalidators.ColorscaleValidator.named_colorscales, but that's private and has no method for adding a new scale.
ColorscaleValidator("", "").validate_coerce(diverging) works to do the tuple of tuples to list of lists conversion, but again it's not public, and it seems weird that it would be necessary to run any coercion on a colorscale coming from a template anyway.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với plotly.colors.validate_colorscale và sample_colorscale, sau đó theo dõi cách plotly.io.templates cung cấp các giá trị layout.colorscale thông qua ColorscaleValidator. So sánh kết quả list-of-lists tích hợp sẵn với kết quả tuple-of-tuples của template và đường dẫn coercion hiện có; công việc được xem là hoàn tất khi các colorscale của template có thể được truyền vào sample_colorscale mà không gặp lỗi validation đã báo cáo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- data-visualization
- Loại issue
- Lỗi
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 42/100