这个问题几乎类似于this one,但有一个重要的区别,即不适用相同解决方案的连续色阶
import pandas as pd
import plotly.express as px
data = {
'ids':['SA', 'NA', 'Brazil', 'Uruguay', 'USA', 'Canada', 'PFV Brazil', 'PV Brazil', 'PFV Uruguay', 'PV Uruguay', 'PFV USA', 'PV USA', 'PFV Canada', 'PV Canada'],
'labels': ['SA', 'NA', 'Brazil', 'Uruguay', 'USA', 'Canada', 'PFV', 'PV', 'PFV', 'PV', 'PFV', 'PV', 'PFV', 'PV'],
'parent': ['', '', 'SA', 'SA', 'NA', 'NA', 'Brazil', 'Brazil', 'Uruguay', 'Uruguay', 'USA', 'USA', 'Canada', 'Canada'],
'value': [0, 0, 100, 80, 400, 200, 8, 40, 4, 20, 11, 100, 11, 80]
}
fig =px.sunburst(data, names='labels', parents='parent', values='value', ids='ids', color='value',
color_continuous_scale='Blues')
fig.show()
上述代码复制了该图-
正如您所看到的,NA
和SA
的颜色是最低端的颜色(因为它们的值为零),但它们的分割比例和与子对象的大小比例是正确的
如果我输入它们的值,即它们的子类的总数,即用'value': [180, 600, 100, 80, 400, 200, 8, 40, 4, 20, 11, 100, 11, 80]
替换value
,它将生成此图-
在这方面,颜色和比例是正确的,但与儿童班级的比例却不正确。我怎样才能解决这个问题?(我想要第一个图形,但根/父节点的颜色与大小一致)
很明显,如果父类具有值,则即使子类的总和等于父类,子类也会自动划分为非比例的较小扇区。因此,获得某种理想解决方案的唯一方法是父类具有实际值
0
,然后手动为它们指定颜色和悬停标签。因此,我实施了一个(几乎荒谬的)变通方法颜色
这个想法是要有一个非常大的顺序色标,它有数百个元素(或者更多,取决于你想要的范围)。然后将所需颜色(我选择了colorscale的中点)插入到colorscale的起点(minpoint)。通过这种方式,
0
值将具有颜色,并且colorscale的超大尺寸将防止所有其他值与其原始颜色相差太多您可以从this网站生成colorscale。我没有看到任何直接导出或复制选项,所以快速复制到excel中,然后从中选择所需的列对我来说很有用
从中列出一个字符串列表。添加
#
作为每个元素的前缀选择所需颜色并将其添加到列表的前面。我选择了中点
将列表传递给plotting函数的colorscale参数
悬停标签
创建一个由每个扇区的值组成的列表,并将该列表传递给函数中的
custom_data
参数。然后,调用fig.update_traces()
并将%{customdata}
传递给hovertemplate
参数以下是完整的代码-
这是输出(请注意颜色栏的底部:D)——
这决不是一个完美的解决方案,因为
NA
和SA
的颜色是相同的。我认为这也是可以解决的,尽管使用足够大的色阶,并将其中一个的值更改为1
,而不是0
,因为这个微小的更改对于图形上的眼睛来说是不可理解的,并且添加第二个颜色阴影作为列表my_colorscale
上的第二个元素我对更好的解决方案持开放态度,我不会把这当作答案
相关问题 更多 >
编程相关推荐