Vertical Histogram——字母频率柱状图(POJ2136)

本文介绍了一种通过读取四行字母并统计每个字母出现次数的方法,最终输出为垂直柱状图的形式。代码使用C++实现,展示了如何利用数组进行统计及绘制过程。

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

问题描述

读取四行字母,并输出一个垂直柱状图用以显示在输入中的所有字母的出现次数。

输入:

1行到4行: 大写字母 , 每行不超过72个字符

输出:

第一行到第?行: 由星号和空格组成的若干行,最后一行由被分开的大写字母组成。

输入样例:
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM RROGRAM
HELLO!
这里写图片描述

分析:

按照自顶向下,自左向右的顺序绘制统计图
1.定义一个数组statistic 来统计每个字母出现的次数, 设置一个最大值max 表示字母出现的最大次数
2.从统计图中最高的柱子出发:即从最上层( 字母出现次数最多的那一层),自顶向下计算,找出当前行中是否有频率不小于当前行最大频率值的字母 即:判断 statistic[i] >=max-i
(1) 如果有,则输出 一个 * 和一个空格
(2)如果没有,则输出两个空格
3.输入最下层的A-Z字母

代码实现:

//Vertical Histogram柱状图
#include "stdafx.h"
#include <string>
#include <iostream>
#include <ctype.h>
#include <cstdio>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    //数组中存放各个字母出现的次数
    unsigned short statistic[26] = { 0 }; 
    //出现的最大次数
    unsigned short max = 0; 
    int i, j;
    /**输入各行数据并统计每个字母出现的次数
    */

    for (i = 0; i < 4; i++)
    {
        string s;
        getline(cin, s);
        for (j = 0; j < s.size(); j++){
            if (toupper(s[j])&&isalpha(s[j]))
                statistic[s[j] - 'A']++;
        }
    }
    //找出字母出现的最大次数
    for (i = 0; i < 26; i++){
        if (statistic[i] >max)
            max = statistic[i];
    }
    //从统计图中最高的柱子出发:即从最上层 字母出现次数最多的那一层,自顶向下计算
    for (i = max; i > 0; i--)
    {
        for (j = 0; j < 26; j++)
        {
             //寻找当前行中字母出现次数不小于当前行的最大峰值时
            if (statistic[j] >= i)  
                cout << "* ";  //输出 一个 *  和一个空格
            else
                cout << "  "; //否则输出两个连续的空格
        }

        cout << endl;
    }
    //输出最下面一行的A-Z字母
    for (i = 0; i < 26; i++)
        printf("%c ",'A'+i);
    cout << endl;
    return 0;
}

测试结果

这里写图片描述

<think>我们正在处理一个关于Circos绘图的问题,具体是在柱状图histogram)上添加刻度线(ticks)。根据用户提供的引用信息,特别是引用[4]中关于ticks的配置说明,我们可以指导用户如何操作。 首先,在Circos中,刻度线(ticks)是通过配置文件(通常是`ticks.conf`)来设置的。这些设置可以应用于整个Circos图,包括柱状图、折线图等。用户希望为柱状图添加刻度线,实际上就是为整个图添加刻度线,因为Circos的刻度线是绘制在染色体外圈上的。 关键步骤: 1. 在Circos配置中,通常有一个专门用于配置刻度线的文件(如`ticks.conf`),或者可以在主配置文件中直接配置。 2. 根据引用[4]中的示例,我们可以配置`ticks`块来显示刻度线和标签。 具体配置项说明(基于引用[4]): - `show_ticks = yes`:显示刻度线。 - `show_tick_labels = yes`:显示刻度标签。 - `<ticks>`块:包含所有刻度设置。 - `radius`:刻度线的位置(半径),通常设置为`1r`表示在染色体最外侧。 - `color`, `thickness`:刻度线的颜色和粗细。 - `multiplier`:刻度标签的数值需要乘以的因子(例如,如果基因组位置以bp为单位,乘以1e-6表示以Mb为单位显示)。 - `format`:标签的格式化字符串(如`%d`表示整数,`%f`表示浮点数)。 - 在`<ticks>`块内,可以定义多个`<tick>`块,每个`<tick>`块定义一种刻度(如主刻度和次刻度)。 例如,以下是一个配置示例,它定义了两个级别的刻度:每5u一个小刻度(不显示标签),每20u一个大刻度(显示标签): ``` show_ticks = yes show_tick_labels = yes <ticks> radius = 1r color = black thickness = 2p multiplier = 1e-6 format = %d <tick> spacing = 5u size = 20p </tick> <tick> spacing = 20u size = 50p show_label = yes label_size = 50p label_offset = 10p format = %d </tick> </ticks> ``` 注意:这里的`u`表示单位,需要在主配置文件中通过`chromosomes_units`定义。例如,如果设置`chromosomes_units = 1000000`,那么1u就代表1Mb,因此`spacing=5u`就表示每5Mb一个刻度。 另外,柱状图histogram)的绘制与刻度线的设置是独立的。柱状图的数据格式如引用[2]所述,是四列的BED格式(染色体、起始、结束、数值)。刻度线会自动根据染色体位置显示柱状图的外侧(或内侧,取决于半径设置)。 因此,用户只需要在配置文件中添加或修改上述ticks配置,就可以在柱状图周围添加刻度线了。 最后,用户需要注意,刻度线的位置(半径)需要与柱状图的半径协调,避免重叠。通常柱状图的半径(在`<plot>`块中设置)应该小于刻度线的半径(例如,柱状图半径设为0.9r,刻度线半径设为1r),这样刻度线就会在柱状图的外围。 相关问题: 1. 如何调整Circos柱状图的半径以避免与刻度线重叠? 2. 在Circos中,如何为不同的染色体设置不同的刻度线? 3. 如何自定义Circos刻度标签的格式(例如,添加单位)?</think>### 在Circos柱状图中添加刻度线的步骤 在Circos中为柱状图histogram)添加刻度线,需要通过配置文件实现。以下是详细步骤(基于引用[4]的ticks配置说明): #### 1. 创建或修改ticks配置文件 在`ticks.conf`文件中添加以下配置(若不存在则新建): ```ini # 启用刻度显示 show_ticks = yes show_tick_labels = yes <ticks> # 基础设置 radius = 1r # 刻度线位置(1r表示染色体最外侧) color = black # 刻度线颜色 thickness = 2p # 线宽 multiplier = 1e-6 # 数值转换因子(bp转Mb) format = %.1f # 标签格式(保留1位小数) # 主刻度(大刻度) <tick> spacing = 10u # 每10单位一个刻度 size = 15p # 刻度线长度 show_label = yes # 显示数值标签 label_size = 20p # 标签字体大小 label_offset = 5p # 标签与刻度线的距离 format = %d # 整数格式 </tick> # 次刻度(小刻度) <tick> spacing = 2u # 每2单位一个刻度 size = 8p # 较短刻度线 show_label = no # 不显示标签 </tick> </ticks> ``` #### 2. 关键参数说明 - **`spacing`**:刻度间隔 - 单位`u`需与`chromosomes_units`关联(如`chromosomes_units = 1000000`表示1u=1Mb) - **`radius`**:控制刻度位置 - 建议值:`0.95r`(柱状图内侧)或`1.05r`(柱状图外侧) - **`multiplier`**:数据值转换 - 例:原始数据为bp时,`multiplier=1e-6`将标签显示为Mb值 - **嵌套`<tick>`块**:支持多级刻度(主/次刻度) #### 3. 与柱状图参数协调 在柱状图配置文件(如`histogram.conf`)中确保: ```ini <plot> type = histogram file = your_data.txt # 柱状图数据文件(BED格式) r0 = 0.7r # 内半径(避免与刻度重叠) r1 = 0.9r # 外半径(小于ticks的radius值) fill_color = blues-3-seq # 颜色方案 </plot> ``` > 📌 **重要**:柱状图半径(`r0`/`r1`)必须小于刻度线的`radius`值(建议至少差0.05r),否则会发生重叠[^4]。 #### 4. 数据文件格式要求 柱状图数据需为4列BED格式(引用[2]): ``` # 染色体 起点 终点 数值 chr1 1000000 3000000 4.2 chr1 5000000 7000000 3.1 chr2 2000000 4000000 5.8 ... ``` #### 5. 效果示例 最终将生成带刻度的柱状图: ``` |----|----|----| ← 刻度线及标签 ██ ████ ██ ← 柱状图 ██████ ████ ------------------ ← 染色体轴 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值