在条形图条上重复填充图像(条形自定义)

Posted

技术标签:

【中文标题】在条形图条上重复填充图像(条形自定义)【英文标题】:Fill images repeatedly on bar graph bars (bars customization) 【发布时间】:2018-09-06 13:53:15 【问题描述】:

如何像模式一样用图像填充条形图的条形?

以下是我的发现或相关问题:

到目前为止,我找到了this useful post。它可以帮助我输出像this 这样的图表。这已经非常接近我想要的了。

但是,我想要像this post 这样的效果。不幸的是,这是一篇 JS 帖子。我只想在达到 1 时用图像填充条形图,相应地在达到 2 时填充两次。对于十进制,它会裁剪图像或调整其大小以适合条形。

这是我的游乐场代码。

from matplotlib.ticker import FuncFormatter
import matplotlib.pyplot as plt
import numpy as np
import imageio
import math

def image_plot(heights, images, spacing=0):
    # Iterate through images and data, autoscaling the width to
    # the aspect ratio of the image
    for i, (height, img) in enumerate(zip(heights, images)):
        width = 1
        left = width*i
        right = left + width
        plt.imshow(img, extent=[left, right, 0, height])
    # Set x,y limits on plot window
    plt.xlim(0, right)
    plt.ylim(0, max(heights)*2)

data = "success": True,
        "message": 
                "portion": "100g", 
                "nickname": "", 
                "trans-fat(g)": "NA", 
                "carbohydrates(g)": "42", 
                "type": "breakfast", 
                "sugar(g)": "14", 
                "energy(kcal)": "260", 
                "fat(g)": "7.3", 
                "fiber(g)": "1.6", 
                "cholesterol(mg)": "17", 
                "protein(g)": "7.3",
                "Na(mg)": "290", 
                "name": "Pork Burger"
                 
        
msg = data["message"]
x = np.arange(5)
values = [msg["energy(kcal)"], msg["protein(g)"], msg["fat(g)"], msg["sugar(g)"], msg["Na(mg)"]]
values = list(map(float, values))
compare = [457.0,4.68,33.15,34.98,196.38]
values[0] = values[0]/compare[0]
values[1] = values[1]/compare[1]
values[2] = values[2]/compare[2]
values[3] = values[3]/compare[3]
values[4] = values[4]/compare[4]

label = ['energy(kcal)', 'protein(g)', 'fat(g)', 'sugar(g)', 'sodium(mg)']
demaeitcho_img = imageio.imread('./img/damaeitcho.png')
soymilk_img = imageio.imread('./img/soymilk.png')
beefpho_img = imageio.imread('./img/beefpho.png')
coke_img = imageio.imread('./img/coke.png')
luncheonmeat_img = imageio.imread('./img/luncheonmeat.png')

imgs = [demaeitcho_img,soymilk_img,beefpho_img,coke_img,luncheonmeat_img]
image_plot(values, imgs, spacing=0)
plt.xticks(x, ("DemaeItcho","SoyMilk","BeefPho","Coke","LuncheonMeat"), color='orange')
    我需要为每张图片调用“plt.imshow()”吗? 是否必须使所有图像具有相同的大小才能在条形上执行更好的纹理映射?

【问题讨论】:

是的,您需要致电imshow 获取所有图像。因此,如果一个条形图包含 3 次相同的图像,您调用 imshow 3 次。准备类似比例的图像以使条看起来不歪斜当然是有意义的。 @ImportanceOfBeingErnest Thx 伙计,我想我已经找到了方法 :D 现在要回答我的问题,因为任何人都在寻找这种东西 在 Markdown 中实现分段,请不要使用<br><br>,只需使用两个回车即可。问题很少需要换行。 嗯...你的意思是使用 吗?我只是在谷歌上搜索了一下。很抱歉那个双重,我不知道使用这个问题编辑器的标准。 【参考方案1】:

在对该方法进行调查后,要生成理想的图形,需要多次调用 plt.imshow(感谢ImportanceOfBeingErnest 的提示)

所以,结果是第一位的。Click me to see the effect.

为此,我们需要一个 while 循环或一个 for 循环来计算我们需要执行多少次 imshow()。

......
for i, (height, img) in enumerate(zip(heights, images)):
    ......
    count = 0
    while(count<= var_each_image_count):
#                        image l.side,r.side, b.side,  t.side
        plt.imshow(img, extent=[left, right, (count), (count+1)])
        count = count + 1
......

记住不要使用 plt.bar(),因为它会在图像上覆盖一个新的纯色条。 但是,使用这种方法似乎无法支持 CROP,因为裁剪图像需要图像上的特定坐标才能进行裁剪。

【讨论】:

以上是关于在条形图条上重复填充图像(条形自定义)的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用ggpubr包的ggbarplot函数可视化排序条形图(自定义填充色自定义条形边缘色自定义调色板条形图分组排序从小到大文本标签角度)

R语言使用ggpubr包的ggbarplot函数可视化排序条形图(自定义填充色自定义条形边缘色自定义调色板条形图全局排序从大到小文本标签角度)

R语言使用ggpubr包的ggbarplot函数可视化排序条形图(自定义填充色自定义条形边缘色自定义调色板条形图全局排序从大到小文本标签角度)

R语言使用ggpubr包的ggbarplot函数可视化排序条形图(自定义填充色自定义条形边缘色自定义调色板条形图全局排序从大到小文本标签角度)

R语言使用ggpubr包的ggbarplot函数可视化偏差条形图(计算数值的z-score自定义填充色自定义条形边缘色自定义调色板条形图全局排序从小到大文本标签角度添加图例标题轴标签)

R语言使用ggpubr包的ggbarplot函数可视化水平偏差条形图(计算数值的z-score自定义填充色自定义条形边缘色自定义调色板条形图全局排序从小到大文本标签角度添加图例标签轴标签