Color 3-D Bars by Height问题的两种解决方法

本文讨论了MATLAB中使用bar3函数绘制三维柱状图时遇到的颜色问题,包括如何实现根据Z轴渐变颜色和使用不同颜色表示不同数值。提供了相应的代码示例,以解决bar3函数默认颜色随X轴或Y轴变化的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数bar3的不便之处

在使用MATLAB绘制三维柱状图的时候,我们想要的往往是柱状图的颜色是根据Z轴而逐渐改变的,即我们想要达到这样的目的:

  1. 对于M×N矩阵里的不同数值,使用渐进的颜色;
  2. 对于M×N矩阵里的不同数值,使用不同的颜色;

而不是得到像MATALB文档1 里这样的结果,随着X轴或者Y轴而改变颜色,具体如下图所示,其对应的实现代码如下:

Z = magic(5);
b = bar3(Z);
colorbar

使用渐进的颜色

针对如上描述的问题,MATLAB文档2给出了使用渐进的颜色的解决方法,其实现代码如下:

for k = 1:length(b)
    zdata = 
import re from collections import defaultdict from datetime import datetime import chardet import codecs import matplotlib.pyplot as plt def calculate_wakeup_sources_and_time_range(filenames): # 初始化字典来存储actice唤醒源和它们的计数 #所有的wakeup_source 总数 total_count_all = 0 #初始化字典来存储active_wakeup_source和它们的计数 active_wakeup_source = defaultdict(int) active_wakeup_count = 0 # 初始化字典来存储唤醒源和它们的计数 wakeup_sources = defaultdict(int) total_count = 0 pct_counts = [0]*6 # 用于存储不同范围的计数 time_format = "%Y-%m-%d %H:%M:%S" min_time = None max_time = None # 预编译正则表达式 source_pattern = re.compile(r&#39;wake up by\s+(.*?),&#39;) active_wakeup_pattern = re.compile(r&#39;active Wakeup Source:\s+(.*)&#39;) pct_pattern = re.compile(r&#39;26M_off_pct = (\d+)&#39;) time_pattern = re.compile(r&#39;android time (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})&#39;) for filename in filenames: # 以UTF-8编码方式打开文件,如果文件不是UTF-8编码,就自动转换 with codecs.open(filename, &#39;r&#39;, encoding=&#39;utf-8&#39;, errors=&#39;replace&#39;) as file: for line in file: match = source_pattern.search(line) if match: source = match.group(1).strip() wakeup_sources[source] += 1 total_count += 1 pct_match = pct_pattern.search(line) if pct_match: pct = int(pct_match.group(1)) if pct == 0: pct_counts[0] += 1 elif 0 < pct <= 20: pct_counts[1] += 1 elif 20 < pct <= 40: pct_counts[2] += 1 elif 40 < pct <= 60: pct_counts[3] += 1 elif 60 < pct <= 80: pct_counts[4] += 1 elif 80 < pct <= 100: pct_counts[5] += 1 # 统计actice/pending wakeup sources active_match = active_wakeup_pattern.search(line) if active_match: #定义一个保存actice_wakeup 的属性 Last_active_Wakeup_Source = active_match.group(1).strip() active_wakeup_source[Last_active_Wakeup_Source] +=1 total_count_all += 1 active_wakeup_count += 1 time_match = time_pattern.search(line) if time_match: time_str = time_match.group(1) time = datetime.strptime(time_str, time_format) if min_time is None or time < min_time: min_time = time if max_time is None or time > max_time: max_time = time # 计算每个唤醒源的百分比,并输出它们的次数 print(f&#39;&#39;) print(f&#39;&#39;) print(f&#39;&#39;) for source, count in wakeup_sources.items(): percent = (count / total_count) * 100 print(f&#39;{source:<50} {percent:.2f}% {count} ({count}/{total_count})&#39;) print(f&#39;--------------------------------------------------------------------------------------&#39;) # 输出 "26M_off_pct" 在不同范围内的计数 percent0 = (pct_counts[0] / total_count) * 100 percent1 = (pct_counts[1] / total_count) * 100 percent2 = (pct_counts[2] / total_count) * 100 percent3 = (pct_counts[3] / total_count) * 100 percent4 = (pct_counts[4] / total_count) * 100 percent5 = (pct_counts[5] / total_count) * 100 print(f&#39; 26M_off_pct = 0 {percent0:.2f}% {pct_counts[0]} ({pct_counts[0]}/{total_count})&#39;) print(f&#39; 0 < 26M_off_pct <= 20 {percent1:.2f}% {pct_counts[1]} ({pct_counts[1]}/{total_count})&#39;) print(f&#39;20 < 26M_off_pct <= 40 {percent2:.2f}% {pct_counts[2]} ({pct_counts[2]}/{total_count})&#39;) print(f&#39;40 < 26M_off_pct <= 60 {percent3:.2f}% {pct_counts[3]} ({pct_counts[3]}/{total_count})&#39;) print(f&#39;60 < 26M_off_pct <= 80 {percent4:.2f}% {pct_counts[4]} ({pct_counts[4]}/{total_count})&#39;) print(f&#39;80 < 26M_off_pct <= 100 {percent5:.2f}% {pct_counts[5]} ({pct_counts[5]}/{total_count})&#39;) print(f&#39;--------------------------------------------------------------------------------------&#39;) # 输出 actice Wakeup sources的统计结果 for Last_active_Wakeup_Source, count in active_wakeup_source.items(): active_percent = (count / total_count_all) * 100 print(f&#39;Last active Wakeup Source: {Last_active_Wakeup_Source:<50} {active_percent:.2f}% {count} ({count}/{total_count_all})&#39;) # 计算并输出日志的时间范围 if min_time is not None and max_time is not None: delta = max_time - min_time hours = delta.seconds // 3600 minutes = (delta.seconds // 60) % 60 print(f&#39;&#39;) #print(f&#39;记录的时间范围是 {hours} 小时 {minutes} 分钟 开始时间:{min_time} ----- 结束时间:{max_time} &#39;) print(f&#39;&#39;) print(f&#39;&#39;) print(f&#39;&#39;) while True: try: # 获取用户输入的文件路径 filenames = input("请输入日志文件的路径(多个文件请用逗号分隔):").split(&#39;,&#39;) # 去除每个文件路径前后的双引号 filenames = [filename.strip(&#39;"&#39;) for filename in filenames] calculate_wakeup_sources_and_time_range(filenames) # 提取数据和标签 sources = list(active_wakeup_source.keys()) counts = list(active_wakeup_source.values()) # 创建图形 plt.figure(figsize=(10, 6)) # 设置图形大小 # 绘制条形图 bars = plt.bar(sources, counts, color=&#39;skyblue&#39;) # 添加数据标签 for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height, f&#39;{height}&#39;, ha=&#39;center&#39;, va=&#39;bottom&#39;) # 设置标题和标签 plt.title(&#39;设备唤醒源统计&#39;, fontsize=14) plt.xlabel(&#39;唤醒源类型&#39;, fontsize=12) plt.ylabel(&#39;唤醒次数&#39;, fontsize=12) plt.xticks(rotation=45) # 旋转X轴标签 # 添加网格线 plt.grid(axis=&#39;y&#39;, linestyle=&#39;--&#39;, alpha=0.7) # 自动调整布局 plt.tight_layout() # 显示图形 plt.show() except OSError as e: print(f"解析文件发生异常:{e}")
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值