# 子弹图(Bullet chart)绘制很难吗？绘制技巧整理送你~~

• 子弹图(Bullet chart)简单介绍
• 子弹图(Bullet chart)的R绘制技巧
• 子弹图(Bullet chart)的Python绘制技巧

## 子弹图(Bullet chart)简单介绍

• 文字标签和主体条柱
• 刻度量表
• 主要标记标识
• 用于对比的标识(可选)
• 定性范围标识，一般2-5个即可。

## 子弹图(Bullet chart)的R绘制技巧

### R-ggplot2包绘制

R-ggplot2包绘制子弹图(Bullet chart) 还是非常方便的，如下：

「样例一」：

```library(tidyverse)
tibble(
name = "Example",
quant_value = 75,
qualitative = 100
) %>%
ggplot(aes(x = quant_value, y = name)) +
geom_col(aes(x = qualitative), fill = "grey") +
geom_col(width = 0.5, fill = "black") +
coord_cartesian(ylim = c(0.3, 1.7)) +
theme_minimal() +
theme(panel.grid.major.y = element_blank())
```

Example01 Of Bullet chart in ggplot2

```ex_df <- bind_rows(
tibble(
name = rep("Ex 1", 2),
group = c("Qualitative", "Measure"),
color = c("grey", "black"),
value = c(100, 75),
width = c(0.9, 0.5),
target = rep(82, 2),
ymin = rep(0.7, 2),
ymax = rep(1.3, 2)
),
tibble(
name = rep("Ex 2", 2),
group = c("Qualitative", "Measure"),
color = c("grey", "black"),
value = c(88, 64),
width = c(0.9, 0.5),
target = rep(77, 2),
ymin = rep(1.7, 2),
ymax = rep(2.3, 2)
)
)

ex_df %>%
ggplot(aes(x = value, y = name, fill = color)) +
geom_col(width = c(0.9, 0.5, 0.9, 0.5)) +
geom_linerange(
aes(x = target, ymin = ymin, ymax = ymax),
size = 2, color = "red"
) +
coord_cartesian(ylim = c(0.3, 2.7)) +
scale_fill_identity() +
theme_minimal() +
theme(panel.grid.major.y = element_blank())
```

Example02 Of Bullet chart in ggplot2

### R-bulletchartr包绘制

R-bulletchartr包则是专门用于绘制子弹图(Bullet chart) 的第三方包，使用也非常方便，且其对绘图数据的格式要求也比较低，详细介绍如下：

「样例一」：bullet_chart()

• 数据预览：
• 绘制代码
```## load example data

bullet_chart(dataframe = bc_ex)
```

Example Of bullet_chart()

「样例二」：bullet_chart_wide()

• 数据预览：
• 绘制代码:
```bullet_chart_wide(file_name = read_example("Indicators_Targets_ext.xlsx"),
cal_type = "cal")
```

Example Of bullet_chart_wide()

「样例三」：bullet_chart_vline()

• 数据预览：
• 绘制代码:
```bullet_chart_vline(file_name = read_example("Indicators_Targets_ext.xlsx"))
```

Example Of bullet_chart_vline()

## Python绘制

### Python-plotly 绘制

「样例一」：

```import plotly.graph_objects as go

fig = go.Figure(go.Indicator(
mode = "number+gauge+delta", value = 220,
domain = {'x': [0, 1], 'y': [0, 1]},
delta = {'reference': 280, 'position': "top"},
title = {'text':"<b>Profit</b><br><span style='color: gray; font-size:0.8em'>U.S. \$</span>", 'font': {"size": 14}},
gauge = {
'shape': "bullet",
'axis': {'range': [None, 300]},
'threshold': {
'line': {'color': "red", 'width': 2},
'thickness': 0.75, 'value': 270},
'bgcolor': "white",
'steps': [
{'range': [0, 150], 'color': "cyan"},
{'range': [150, 250], 'color': "royalblue"}],
'bar': {'color': "darkblue"}}))
fig.update_layout(height = 250)
fig.show()
```

Example01 Of Bullet chart in plotly

「样例二」：Multi Bullet

```import plotly.graph_objects as go

fig = go.Figure()

mode = "number+gauge+delta", value = 180,
delta = {'reference': 200},
domain = {'x': [0.25, 1], 'y': [0.08, 0.25]},
title = {'text': "Revenue"},
gauge = {
'shape': "bullet",
'axis': {'range': [None, 300]},
'threshold': {
'line': {'color': "black", 'width': 2},
'thickness': 0.75,
'value': 170},
'steps': [
{'range': [0, 150], 'color': "gray"},
{'range': [150, 250], 'color': "lightgray"}],
'bar': {'color': "black"}}))

mode = "number+gauge+delta", value = 35,
delta = {'reference': 200},
domain = {'x': [0.25, 1], 'y': [0.4, 0.6]},
title = {'text': "Profit"},
gauge = {
'shape': "bullet",
'axis': {'range': [None, 100]},
'threshold': {
'line': {'color': "black", 'width': 2},
'thickness': 0.75,
'value': 50},
'steps': [
{'range': [0, 25], 'color': "gray"},
{'range': [25, 75], 'color': "lightgray"}],
'bar': {'color': "black"}}))

mode = "number+gauge+delta", value = 220,
delta = {'reference': 200},
domain = {'x': [0.25, 1], 'y': [0.7, 0.9]},
title = {'text' :"Satisfaction"},
gauge = {
'shape': "bullet",
'axis': {'range': [None, 300]},
'threshold': {
'line': {'color': "black", 'width': 2},
'thickness': 0.75,
'value': 210},
'steps': [
{'range': [0, 150], 'color': "gray"},
{'range': [150, 250], 'color': "lightgray"}],
'bar': {'color': "black"}}))
fig.update_layout(height = 400 , margin = {'t':0, 'b':0, 'l':0})

fig.show()
```

Example02 Of Bullet chart in plotly

Python-plotly库绘图功能还是非常强大的，后期公众号会推出系列专题。更多plotly库绘制子弹图(Bullet chart) 可参考plotly库绘制子弹图[2]。

## 子弹图PDF文件获取

### 参考资料

[1]

R-bulletchartr包官网: https://acdivocatech.github.io/bulletchartr/index.html。

[2]

plotly库绘制子弹图: https://plotly.com/python/bullet-charts/。

0 条评论

• ### 【Pygame 第5课】 游戏中的运动

本来，在上一次pygame的教程中，我只是顺手拿了微信“打飞机”里的图来演示用鼠标控制图片位置的操作。后来觉得，这个游戏还算比较适合用来做例子，也有朋友反馈说想...

• ### Node 开发一个多人对战的射击游戏(实战长文)

https://juejin.cn/post/6960096410305822751

• ### 如何用 Python 打飞机 ？

前言：python 除了生孩子 ，啥都会 。包括打飞机 ！今天小詹的一位读者就来教你如何用 python 打飞机 ！

• ### 【响应式编程的思维艺术】 （4）从打飞机游戏理解并发与流的融合

原文中提供了一个非常详细的打飞机游戏的代码，但我仍然建议你在熟悉了其基本原理和思路后自己将它实现出来，然后去和原文中的代码作对比，好搞清楚哪些东西是真的理解了，...

• ### 飞机大战

我知道我很懒，一直拖一直拖，拖到最后一刻才肯开始撰写推送，但这次真的不是故意的，本来这个链表的应用我是想给大家介绍下线程池的设计，可是线程池这个东西得牵扯到网络...

• ### 手把手教你使用Pygame制作飞机大战小游戏，4万字超详细讲解！

大家好，偷学Python系列是由小甜同学从初学者的角度学习Python的笔记，其特点就是全文大多由新手易理解的代码与注释及动态演示。刚入门的读者千万不要错过！

• ### 手把手教你使用Pygame制作飞机大战小游戏，4万字超详细讲解！

这次用Python中的pygame模块来完成一个飞机大战的小游戏；基本思路是通过方向键来控制飞机的左右移动射击飞船。先来看下最后的效果

• ### 用 Python 制作飞机大战小游戏

这次用Python中的pygame模块来完成一个飞机大战的小游戏；基本思路是通过方向键来控制飞机的左右移动射击飞船。先来看下最后的效果

• ### 10分钟教你用Python做个打飞机小游戏超详细教程

这次还是用python的pygame库来做的游戏。关于这个库的内容，读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上，自己也做了一点代码简化。尽量把最...

• ### 子弹图（bullet chart）

今天跟大家分享的图表是——子弹图（bullet chart）！ ▽▼▽ 名字听起来是不是很高大上呀，这个图表是用于日常绩效评估的，可以从图表中了解到各个项目的目...

• ### 基于SceneForm实现子弹射击（绘制子弹运行轨迹）

Sceneform 框架很强大，不了解 Sceneform 的时候，觉得要想做 3D 场景需要会 OpenGL，而 OpenGL 的学习曲线很陡；接触到这个框架...

• ### python应用篇之外星人入侵项目——武装飞船(完)

上篇文章，我们给大家介绍了飞船的左右移动，以及配置相应的飞船速度以及相应的限制飞船的运动范围。最后将方法check_events方法进行了重构；并且对最近的几...

• ### 10分钟教你用Python做个打飞机小游戏超详细教程

这次还是用python的pygame库来做的游戏。关于这个库的内容，读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上，自己也做了一点代码简化。尽量把最...

• ### Python 项目实践一（外星人入侵小游戏）第三篇

接着上节的继续学习， 一 重构：模块game_functions 在大型项目中，经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构，使其更容易扩展。...

• ### 关于流程图设计，你需要Get的几点必备知识

流程图（Flow Chart）这个概念对很多人来说并不陌生，但如果让你定义或者举例说明什么是产品流程图，恐怕还是有难度的。或许诸如“用户体验”、“交互设计”、...

• ### 【Pygame 第6课】 面向对象的游戏设计

上节课中，我们的飞机已经可以发射子弹了，尽管只有一颗。为什么我只加了一颗？试着多加几颗你就会发现，你得用好几个变量去分别记录它们的xy坐标，在主循环中判断每一颗...

• ### ChartDirector应用笔记（一）

ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库。其适用的语言范围非常广泛，包括.Net, Java, Asp, VB, ...

• ### 子弹图（条形图实现）（Bullet Chart）

今天要跟大家分享的技巧是子弹图（Bullet Chart）在条形图中的实现！ ▽▼▽ 前一篇分享了子弹图（柱形形式）的 制作技巧，这一片接着讲解子弹图在条形图中...