最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#基于ScottPlot實現(xiàn)可視化的示例代碼

 更新時間:2024年01月14日 08:50:42   作者:mingupupup  
這篇文章主要為大家詳細(xì)介紹了C#如何基于ScottPlot實現(xiàn)可視化效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

上一篇文章跟大家分享了用NumSharp實現(xiàn)簡單的線性回歸,但是沒有進(jìn)行可視化,可能對擬合的過程沒有直觀的感受,因此今天跟大家介紹一下使用C#基于Scottplot進(jìn)行可視化,當(dāng)然Python的代碼,我也會同步進(jìn)行可視化。

Python代碼進(jìn)行可視化

Python代碼用matplotlib做了可視化,我就不具體介紹了。

修改之后的python代碼如下:

#The optimal values of m and b can be actually calculated with way less effort than doing a linear regression. 
#this is just to demonstrate gradient descent

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


# y = mx + b
# m is slope, b is y-intercept
def compute_error_for_line_given_points(b, m, points):
    totalError = 0
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        totalError += (y - (m * x + b)) ** 2
    return totalError / float(len(points))

def step_gradient(b_current, m_current, points, learningRate):
    b_gradient = 0
    m_gradient = 0
    N = float(len(points))
    for i in range(0, len(points)):
        x = points[i, 0]
        y = points[i, 1]
        b_gradient += -(2/N) * (y - ((m_current * x) + b_current))
        m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current))
    new_b = b_current - (learningRate * b_gradient)
    new_m = m_current - (learningRate * m_gradient)
    return [new_b, new_m]

def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
    b = starting_b
    m = starting_m
    args_data = []
    for i in range(num_iterations):
        b, m = step_gradient(b, m, np.array(points), learning_rate)
        args_data.append((b,m))
    return args_data

if __name__ == '__main__':
     points = np.genfromtxt("data.csv", delimiter=",")
     learning_rate = 0.0001
     initial_b = 0 # initial y-intercept guess
     initial_m = 0 # initial slope guess
     num_iterations = 10
     print ("Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b, initial_m, compute_error_for_line_given_points(initial_b, initial_m, points)))
     print ("Running...")
     args_data = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations)
     
     b = args_data[-1][0]
     m = args_data[-1][1]

     print ("After {0} iterations b = {1}, m = {2}, error = {3}".format(num_iterations, b, m, compute_error_for_line_given_points(b, m, points)))
    
     data = np.array(points).reshape(100,2)
     x1 = data[:,0]
     y1 = data[:,1]
     
     x2 = np.linspace(20, 80, 100)
     y2 = initial_m * x2 + initial_b

     data2 = np.array(args_data)
     b_every = data2[:,0]
     m_every = data2[:,1]

     # 創(chuàng)建圖形和軸
     fig, ax = plt.subplots()
     line1, = ax.plot(x1, y1, 'ro')
     line2, = ax.plot(x2,y2)

     # 添加標(biāo)簽和標(biāo)題
     plt.xlabel('x')
     plt.ylabel('y')
     plt.title('Graph of y = mx + b')

     # 添加網(wǎng)格
     plt.grid(True)

    # 定義更新函數(shù)
     def update(frame):
        line2.set_ydata(m_every[frame] * x2 + b_every[frame])
        ax.set_title(f'{frame} Graph of y = {m_every[frame]:.2f}x + {b_every[frame]:.2f}')
    
# 創(chuàng)建動畫
animation = FuncAnimation(fig, update, frames=len(data2), interval=500)

# 顯示動畫
plt.show()

實現(xiàn)的效果如下所示:

C#代碼進(jìn)行可視化

這是本文重點(diǎn)介紹的內(nèi)容,本文的C#代碼通過Scottplot進(jìn)行可視化。

Scottplot簡介

ScottPlot 是一個免費(fèi)的開源繪圖庫,用于 .NET,可以輕松以交互方式顯示大型數(shù)據(jù)集。

控制臺程序可視化

首先我先介紹一下在控制臺程序中進(jìn)行可視化。

首先添加Scottplot包:

將上篇文章中的C#代碼修改如下:

using NumSharp;

namespace LinearRegressionDemo
{
    internal class Program
    {    
        static void Main(string[] args)
        {   
            //創(chuàng)建double類型的列表
            List<double> Array = new List<double>();
            List<double> ArgsList = new List<double>();

            // 指定CSV文件的路徑
            string filePath = "你的data.csv路徑";

            // 調(diào)用ReadCsv方法讀取CSV文件數(shù)據(jù)
            Array = ReadCsv(filePath);

            var array = np.array(Array).reshape(100,2);

            double learning_rate = 0.0001;
            double initial_b = 0;
            double initial_m = 0;
            double num_iterations = 10;

            Console.WriteLine($"Starting gradient descent at b = {initial_b}, m = {initial_m}, error = {compute_error_for_line_given_points(initial_b, initial_m, array)}");
            Console.WriteLine("Running...");
            ArgsList = gradient_descent_runner(array, initial_b, initial_m, learning_rate, num_iterations);
            double b = ArgsList[ArgsList.Count - 2];
            double m = ArgsList[ArgsList.Count - 1];
            Console.WriteLine($"After {num_iterations} iterations b = , m = {m}, error = {compute_error_for_line_given_points(b, m, array)}");
            Console.ReadLine();

            var x1 = array[$":", 0];
            var y1 = array[$":", 1];
            var y2 = m * x1 + b;

            ScottPlot.Plot myPlot = new(400, 300);
            myPlot.AddScatterPoints(x1.ToArray<double>(), y1.ToArray<double>(), markerSize: 5);
            myPlot.AddScatter(x1.ToArray<double>(), y2.ToArray<double>(), markerSize: 0);
            myPlot.Title($"y = {m:0.00}x + {b:0.00}");

            myPlot.SaveFig("圖片.png");
       
        }

        static List<double> ReadCsv(string filePath)
        {
            List<double> array = new List<double>();
            try
            {
                // 使用File.ReadAllLines讀取CSV文件的所有行
                string[] lines = File.ReadAllLines(filePath);             

                // 遍歷每一行數(shù)據(jù)
                foreach (string line in lines)
                {
                    // 使用逗號分隔符拆分每一行的數(shù)據(jù)
                    string[] values = line.Split(',');

                    // 打印每一行的數(shù)據(jù)
                    foreach (string value in values)
                    {
                        array.Add(Convert.ToDouble(value));
                    }                  
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("發(fā)生錯誤: " + ex.Message);
            }
            return array;
        }

        public static double compute_error_for_line_given_points(double b,double m,NDArray array)
        {
            double totalError = 0;
            for(int i = 0;i < array.shape[0];i++)
            {
                double x = array[i, 0];
                double y = array[i, 1];
                totalError += Math.Pow((y - (m*x+b)),2);
            }
            return totalError / array.shape[0];
        }

        public static double[] step_gradient(double b_current,double m_current,NDArray array,double learningRate)
        {
            double[] args = new double[2];
            double b_gradient = 0;
            double m_gradient = 0;
            double N = array.shape[0];

            for (int i = 0; i < array.shape[0]; i++)
            {
                double x = array[i, 0];
                double y = array[i, 1];
                b_gradient += -(2 / N) * (y - ((m_current * x) + b_current));
                m_gradient += -(2 / N) * x * (y - ((m_current * x) + b_current));
            }

            double new_b = b_current - (learningRate * b_gradient);
            double new_m = m_current - (learningRate * m_gradient);
            args[0] = new_b;
            args[1] = new_m;

            return args;
        }

        public static List<double> gradient_descent_runner(NDArray array, double starting_b, double starting_m, double learningRate,double num_iterations)
        {
            double[] args = new double[2];
            List<double> argsList = new List<double>();
            args[0] = starting_b;
            args[1] = starting_m;

            for(int i = 0 ; i < num_iterations; i++) 
            {
                args = step_gradient(args[0], args[1], array, learningRate);
                argsList.AddRange(args);
            }

            return argsList;
        }


    }
}

然后得到的圖片如下所示:

在以上代碼中需要注意的地方:

  var x1 = array[$":", 0];
  var y1 = array[$":", 1];

是在使用NumSharp中的切片,x1表示所有行的第一列,y1表示所有行的第二列。

當(dāng)然我們不滿足于只是保存圖片,在控制臺應(yīng)用程序中,再添加一個 ScottPlot.WinForms包:

右鍵控制臺項目選擇屬性,將目標(biāo)OS改為Windows:

將上述代碼中的

  myPlot.SaveFig("圖片.png");

修改為:

 var viewer = new ScottPlot.FormsPlotViewer(myPlot);
 viewer.ShowDialog();

再次運(yùn)行結(jié)果如下:

winform進(jìn)行可視化

我也想像Python代碼中那樣畫動圖,因此做了個winform程序進(jìn)行演示。

首先創(chuàng)建一個winform,添加ScottPlot.WinForms包,然后從工具箱中添加FormsPlot這個控件:

有兩種方法實現(xiàn),第一種方法用了定時器:

using NumSharp;
namespace WinFormDemo
{
    public partial class Form1 : Form
    {
        System.Windows.Forms.Timer updateTimer = new System.Windows.Forms.Timer();
        int num_iterations;
        int count = 0;
        NDArray? x1, y1, b_each, m_each;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StartLinearRegression();
        }

        public void StartLinearRegression()
        {
            //創(chuàng)建double類型的列表
            List<double> Array = new List<double>();
            List<double> ArgsList = new List<double>();

            // 指定CSV文件的路徑
            string filePath = "你的data.csv路徑";

            // 調(diào)用ReadCsv方法讀取CSV文件數(shù)據(jù)
            Array = ReadCsv(filePath);

            var array = np.array(Array).reshape(100, 2);

            double learning_rate = 0.0001;
            double initial_b = 0;
            double initial_m = 0;
            num_iterations = 10;

            ArgsList = gradient_descent_runner(array, initial_b, initial_m, learning_rate, num_iterations);

            x1 = array[$":", 0];
            y1 = array[$":", 1];

            var argsArr = np.array(ArgsList).reshape(num_iterations, 2);
            b_each = argsArr[$":", 0];
            m_each = argsArr[$":", 1];

            double b = b_each[-1];
            double m = m_each[-1];
            var y2 = m * x1 + b;

            formsPlot1.Plot.AddScatterPoints(x1.ToArray<double>(), y1.ToArray<double>(), markerSize: 5);
            //formsPlot1.Plot.AddScatter(x1.ToArray<double>(), y2.ToArray<double>(), markerSize: 0);
            formsPlot1.Render();


        }

        static List<double> ReadCsv(string filePath)
        {
            List<double> array = new List<double>();
            try
            {
                // 使用File.ReadAllLines讀取CSV文件的所有行
                string[] lines = File.ReadAllLines(filePath);

                // 遍歷每一行數(shù)據(jù)
                foreach (string line in lines)
                {
                    // 使用逗號分隔符拆分每一行的數(shù)據(jù)
                    string[] values = line.Split(',');

                    // 打印每一行的數(shù)據(jù)
                    foreach (string value in values)
                    {
                        array.Add(Convert.ToDouble(value));
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("發(fā)生錯誤: " + ex.Message);
            }
            return array;
        }

        public static double compute_error_for_line_given_points(double b, double m, NDArray array)
        {
            double totalError = 0;
            for (int i = 0; i < array.shape[0]; i++)
            {
                double x = array[i, 0];
                double y = array[i, 1];
                totalError += Math.Pow((y - (m * x + b)), 2);
            }
            return totalError / array.shape[0];
        }

        public static double[] step_gradient(double b_current, double m_current, NDArray array, double learningRate)
        {
            double[] args = new double[2];
            double b_gradient = 0;
            double m_gradient = 0;
            double N = array.shape[0];

            for (int i = 0; i < array.shape[0]; i++)
            {
                double x = array[i, 0];
                double y = array[i, 1];
                b_gradient += -(2 / N) * (y - ((m_current * x) + b_current));
                m_gradient += -(2 / N) * x * (y - ((m_current * x) + b_current));
            }

            double new_b = b_current - (learningRate * b_gradient);
            double new_m = m_current - (learningRate * m_gradient);
            args[0] = new_b;
            args[1] = new_m;

            return args;
        }

        public static List<double> gradient_descent_runner(NDArray array, double starting_b, double starting_m, double learningRate, double num_iterations)
        {
            double[] args = new double[2];
            List<double> argsList = new List<double>();
            args[0] = starting_b;
            args[1] = starting_m;

            for (int i = 0; i < num_iterations; i++)
            {
                args = step_gradient(args[0], args[1], array, learningRate);
                argsList.AddRange(args);
            }

            return argsList;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 初始化定時器
            updateTimer.Interval = 1000; // 設(shè)置定時器觸發(fā)間隔(毫秒)
            updateTimer.Tick += UpdateTimer_Tick;
            updateTimer.Start();
        }

        private void UpdateTimer_Tick(object? sender, EventArgs e)
        {
            if (count >= num_iterations)
            {
                updateTimer.Stop();
            }
            else
            {
                UpdatePlot(count);
            }

            count++;
        }

        public void UpdatePlot(int count)
        {

            double b = b_each?[count];
            double m = m_each?[count];

            var y2 = m * x1 + b;

            formsPlot1.Plot.Clear();
            formsPlot1.Plot.AddScatterPoints(x1?.ToArray<double>(), y1?.ToArray<double>(), markerSize: 5);
            formsPlot1.Plot.AddScatter(x1?.ToArray<double>(), y2.ToArray<double>(), markerSize: 0);
            formsPlot1.Plot.Title($"第{count + 1}次迭代:y = {m:0.00}x + {b:0.00}");
            formsPlot1.Render();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            updateTimer.Stop();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

簡單介紹一下思路,首先創(chuàng)建List<double> argsList用來保存每次迭代生成的參數(shù)b、m,然后用

           var argsArr = np.array(ArgsList).reshape(num_iterations, 2);  

argsList通過np.array()方法轉(zhuǎn)化為NDArray,然后再調(diào)用reshape方法,轉(zhuǎn)化成行數(shù)等于迭代次數(shù),列數(shù)為2,即每一行對應(yīng)一組參數(shù)值b、m。

            b_each = argsArr[$":", 0];
            m_each = argsArr[$":", 1];

argsArr[$":", 0]表示每一行中第一列的值,也就是每一個b,argsArr[$":", 1]表示每一行中第二列的值。

            double b = b_each[-1];
            double m = m_each[-1];

b_each[-1]用了NumSharp的功能表示b_each最后一個元素。

實現(xiàn)效果如下所示:

另一種方法可以通過異步實現(xiàn):

using NumSharp;

namespace WinFormDemo
{
    public partial class Form2 : Form
    {      
        int num_iterations;
        NDArray? x1, y1, b_each, m_each;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StartLinearRegression();
        }

        public void StartLinearRegression()
        {
            //創(chuàng)建double類型的列表
            List<double> Array = new List<double>();
            List<double> ArgsList = new List<double>();

            // 指定CSV文件的路徑
            string filePath = "你的data.csv路徑";

            // 調(diào)用ReadCsv方法讀取CSV文件數(shù)據(jù)
            Array = ReadCsv(filePath);

            var array = np.array(Array).reshape(100, 2);

            double learning_rate = 0.0001;
            double initial_b = 0;
            double initial_m = 0;
            num_iterations = 10;

            ArgsList = gradient_descent_runner(array, initial_b, initial_m, learning_rate, num_iterations);

            x1 = array[$":", 0];
            y1 = array[$":", 1];

            var argsArr = np.array(ArgsList).reshape(num_iterations, 2);
            b_each = argsArr[$":", 0];
            m_each = argsArr[$":", 1];

            double b = b_each[-1];
            double m = m_each[-1];
            var y2 = m * x1 + b;

            formsPlot1.Plot.AddScatterPoints(x1.ToArray<double>(), y1.ToArray<double>(), markerSize: 5);      
            formsPlot1.Render();
        }

        static List<double> ReadCsv(string filePath)
        {
            List<double> array = new List<double>();
            try
            {
                // 使用File.ReadAllLines讀取CSV文件的所有行
                string[] lines = File.ReadAllLines(filePath);

                // 遍歷每一行數(shù)據(jù)
                foreach (string line in lines)
                {
                    // 使用逗號分隔符拆分每一行的數(shù)據(jù)
                    string[] values = line.Split(',');

                    // 打印每一行的數(shù)據(jù)
                    foreach (string value in values)
                    {
                        array.Add(Convert.ToDouble(value));
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("發(fā)生錯誤: " + ex.Message);
            }
            return array;
        }

        public static double compute_error_for_line_given_points(double b, double m, NDArray array)
        {
            double totalError = 0;
            for (int i = 0; i < array.shape[0]; i++)
            {
                double x = array[i, 0];
                double y = array[i, 1];
                totalError += Math.Pow((y - (m * x + b)), 2);
            }
            return totalError / array.shape[0];
        }

        public static double[] step_gradient(double b_current, double m_current, NDArray array, double learningRate)
        {
            double[] args = new double[2];
            double b_gradient = 0;
            double m_gradient = 0;
            double N = array.shape[0];

            for (int i = 0; i < array.shape[0]; i++)
            {
                double x = array[i, 0];
                double y = array[i, 1];
                b_gradient += -(2 / N) * (y - ((m_current * x) + b_current));
                m_gradient += -(2 / N) * x * (y - ((m_current * x) + b_current));
            }

            double new_b = b_current - (learningRate * b_gradient);
            double new_m = m_current - (learningRate * m_gradient);
            args[0] = new_b;
            args[1] = new_m;

            return args;
        }

        public static List<double> gradient_descent_runner(NDArray array, double starting_b, double starting_m, double learningRate, double num_iterations)
        {
            double[] args = new double[2];
            List<double> argsList = new List<double>();
            args[0] = starting_b;
            args[1] = starting_m;

            for (int i = 0; i < num_iterations; i++)
            {
                args = step_gradient(args[0], args[1], array, learningRate);
                argsList.AddRange(args);
            }

            return argsList;
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        public async Task UpdateGraph()
        {
            for (int i = 0; i < num_iterations; i++)
            {
                double b = b_each?[i];
                double m = m_each?[i];
                var y2 = m * x1 + b;

                formsPlot1.Plot.Clear();
                formsPlot1.Plot.AddScatterPoints(x1?.ToArray<double>(), y1?.ToArray<double>(), markerSize: 5);
                formsPlot1.Plot.AddScatter(x1?.ToArray<double>(), y2.ToArray<double>(), markerSize: 0);
                formsPlot1.Plot.Title($"第{i + 1}次迭代:y = {m:0.00}x + {b:0.00}");
                formsPlot1.Render();
           
                await Task.Delay(1000);
            }


        }

        private async void button2_Click(object sender, EventArgs e)
        {
            await UpdateGraph();
        }
    }
}

點(diǎn)擊更新按鈕開始執(zhí)行異步任務(wù):

 private async void button2_Click(object sender, EventArgs e)
        {
            await UpdateGraph();
        }
 public async Task UpdateGraph()
        {
            for (int i = 0; i < num_iterations; i++)
            {
                double b = b_each?[i];
                double m = m_each?[i];
                var y2 = m * x1 + b;

                formsPlot1.Plot.Clear();
                formsPlot1.Plot.AddScatterPoints(x1?.ToArray<double>(), y1?.ToArray<double>(), markerSize: 5);
                formsPlot1.Plot.AddScatter(x1?.ToArray<double>(), y2.ToArray<double>(), markerSize: 0);
                formsPlot1.Plot.Title($"第{i + 1}次迭代:y = {m:0.00}x + {b:0.00}");
                formsPlot1.Render();
           
                await Task.Delay(1000);
            }

實現(xiàn)效果如下:

以上就是C#基于ScottPlot實現(xiàn)可視化的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C# ScottPlot可視化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# List和Dictionary常用的操作

    c# List和Dictionary常用的操作

    這篇文章主要介紹了c# List和Dictionary常用的操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • c# 通過代碼開啟或關(guān)閉防火墻

    c# 通過代碼開啟或關(guān)閉防火墻

    這篇文章主要介紹了c# 通過代碼開啟或關(guān)閉防火墻的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-10-10
  • 利用C#/VB.NET實現(xiàn)將PDF轉(zhuǎn)為Word

    利用C#/VB.NET實現(xiàn)將PDF轉(zhuǎn)為Word

    眾所周知,PDF 文檔支持特長文件,集成度和安全可靠性都較高,可有效防止他人對 PDF 內(nèi)容進(jìn)行更改,所以在工作中深受大家喜愛。本文將分為兩部分介紹如何以編程的方式將 PDF 轉(zhuǎn)換為 Word,需要的可以參考一下
    2022-12-12
  • C#無損高質(zhì)量壓縮圖片代碼

    C#無損高質(zhì)量壓縮圖片代碼

    這篇文章主要為大家詳細(xì)介紹了C#無損高質(zhì)量壓縮圖片代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C#定時器組件FluentScheduler用法

    C#定時器組件FluentScheduler用法

    這篇文章介紹了C#定時器插件FluentScheduler的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#調(diào)用帶結(jié)構(gòu)體指針Dll的方法

    C#調(diào)用帶結(jié)構(gòu)體指針Dll的方法

    在C#到底該如何安全的調(diào)用這樣的DLL接口函數(shù)呢?本文將詳細(xì)介紹如何調(diào)用各種參數(shù)的方法,對C#結(jié)構(gòu)體指針DLL相關(guān)知識感興趣的朋友一起看看吧
    2021-07-07
  • 聊聊C#中的Mixin的具體用法

    聊聊C#中的Mixin的具體用法

    本文主要介紹了C#中的Mixin的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 用C#編寫獲取遠(yuǎn)程IP,MAC的方法

    用C#編寫獲取遠(yuǎn)程IP,MAC的方法

    用C#編寫獲取遠(yuǎn)程IP,MAC的方法...
    2007-04-04
  • C#中委托的進(jìn)一步理解

    C#中委托的進(jìn)一步理解

    這篇文章主要介紹了C#中委托的進(jìn)一步理解,本文講解了委托類型、建立委托鏈、移除委托鏈等內(nèi)容,需要的朋友可以參考下
    2015-02-02
  • C# Newtonsoft自定義JsonConverter的實現(xiàn)

    C# Newtonsoft自定義JsonConverter的實現(xiàn)

    本文介紹了在C#中使用Newtonsoft庫進(jìn)行JSON對象和字符串的序列化與反序列化,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03

最新評論

白朗县| 竹北市| 绍兴县| 县级市| 延安市| 惠水县| 华阴市| 台东市| 防城港市| 永康市| 徐水县| 寿光市| 温宿县| 万源市| 巴楚县| 黔南| 十堰市| 农安县| 彰武县| 黄石市| 屏南县| 孝昌县| 梅州市| 从江县| 建水县| 正阳县| 大冶市| 方正县| 岢岚县| 定西市| 永胜县| 信丰县| 呼图壁县| 康马县| 团风县| 巨鹿县| 柳州市| 十堰市| 深水埗区| 四平市| 咸丰县|